1、在函数体内声明局部变量必须用var,不然将会产生新的全局变量
2、C语言等将花括号作为块级作用域,而JavaScript是用的是函数作用域,意味着变量在声明之前甚至已经可用
var scope="global";
function f(){
console.log(scope); //输出undefined,而不是local
var scope = "local";
console.log(scope); 输出local
}
3、每一段JavaScript代码都有一个与之关联的作用域链,这个作用域链是一个对象列表或者链表,定义了这段代码“作用域中”的变量。当JavaScript需要查找变量x的值的时候,即变量解析过程,它会从链中的第一个对象开始查找,如果这个对象有一个名为x的属性,则会直接使用这个属性的值,如果第一个对象不存在名为x的属性,JavaScript则会继续查找,以此类推,如果没有找到,抛出ReferenceError异常
JavaScript最顶层代码,作用域链是由一个全局对象组成。如果定义了一个不嵌套函数的函数,那么作用域链上有两个对象。在定义这个函数的时候,保存了一个作用域链,当调用这个函数时,它创建一个新的对象来存储它的局部变量,同时创建一个新的更长的表示函数调用作用域的链。
4、闭包:当一个函数嵌套定义了另一个函数,外部函数将嵌套的函数对象作为返回值返回的时候,调用函数时闭包所指向的作用域链和定义函数时的作用域链就不是同一个作用域链了。
var scope="global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()(); //返回local scope
JavaScript函数的执行用到了作用域链,这个链是在函数定义的时候创建的。f()在这个作用域链里,变量一定是局部变量,不管何时执行f(),这种绑定依然有效。
《JavaScript权威指南阅》阅读笔记