本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘
作用域
JavaScript的变量作用域只有两种,全局作用域和函数作用域。
函数的作用域
函数中定义的变量是私有的,仅在本函数范围内有效,称为“函数作用域”。
//每个函数,都定义了一个作用域
function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
console.info(add(, )); //
console.info(sum); //出错!
块作用域与同名变量
JavaScript是没块作用域的
function doSomething(doIt) {
var color = "blue";
if (doIt) {
var color = "red";
console.info("在条件语句中的Color=" + color);
}
console.info("在条件语句外的Color=" + color);
}; doSomething(false); //在条件语句外的Color=blue
doSomething(true); //在条件语句中的Color=red,在条件语句外的Color=red
在if()语句块中定义的color变量,与外部定义的color同名,所以是同一个变量,这是因为javascript并没有块作用域。这与java,c#是不一样的。
变量提升(Hoist)
编译器把函数中后部定义的变量统一移到函数开头进行定义
//hoist: 变量提升
var v = "hello";
(function () {
//输出undefined
console.info(v);
var v = "world";
})();
等价于
var v = "hello";
(function () {
var v;
console.info(v);
v = "world";
})();
所以在函数中定义变量时,要在函数开头集中定义变量,不要在“中途”“临时想起来”地定义变量。
嵌套函数可访问的变量
嵌套的函数,内部函数可以访问外部函数定义的变量,也能访问全局变量
//嵌套函数的变量访问
var world = "world ";
function sayHello() {
var hello = "Hello ";
function inner() {
var info = " in inner function";
console.info(hello + world + info);
}
inner();
}
sayHello(); //hello world in inner function
再谈同名变量
定义变量时,一定要使用var!如没写,就会是全局变量.
var myColor = "red";
//输出:myColor before myFunc() red
console.info("myColor before myFunc()", myColor);
function myFunc() {
//这里有没有var,很关键! 没写var, mycolor就变成全局变量
var myColor = "blue ";
//输出:myColor inside myFunc() blue
console.info("myColor inside myFunc()", myColor);
}
myFunc();
//输出:myColor after myFunc() red
//当第6行去掉var时,这里输出:myColor after myFunc() blue
console.info("myColor after myFunc()", myColor);
变量的查找过程
自下而上,由内至外
//变量的查找过程
var color = "blue";
function outer() {
function getColor() {
return color;
}
console.info(getColor()); //blue
};
outer();