"Scope" 引用的变量在指定时间内的一段代码中的可用性refers to the variables that are available to a piece of code at a given time. 一个不标准的作用域将导致令人沮丧的调试体验。
当使用 var
关键字描述函数中的一个变量时,它作为那个函数中的代码仅仅是个变量 -- 而函数外的代码不能访问这个变量。在其它方面,定义为 inside 的函数 will 能访问到所描述的变量。
此外,在函数里没有使用 var
关键字描述的变量对函数来讲不是局部的 -- JavaScript 将贯穿所有作用域直到 window 作用域以发现之前定义的变量位置。如果变量之前没有定义,它将创建一个全局变量,这会是一个意想不到的结果。
Example 2.41. 函数访问同一作用域内定义的变量
var foo = 'hello'; var sayHello = function() { console.log(foo); }; sayHello(); // logs 'hello' console.log(foo); // also logs 'hello'
Example 2.42. 代码作用域外定义的变量不能访问该变量Code outside the scope in which a variable was defined does not have access to the variable
var sayHello = function() { var foo = 'hello'; console.log(foo); }; sayHello(); // logs 'hello' console.log(foo); // doesn't log anything
Example 2.43. 拥有相同名字的变量可以以不同的值存在不同的作用域中
var foo = 'world'; var sayHello = function() { var foo = 'hello'; console.log(foo); }; sayHello(); // logs 'hello' console.log(foo); // logs 'world'
Example 2.44. 函数定义后可看见变量值的改变
var myFunction = function() { var foo = 'hello'; var myFn = function() { console.log(foo); }; foo = 'world'; return myFn; }; var f = myFunction(); f(); // logs 'world' -- uh oh
Example 2.45. Scope insanity
// 一个自执行的匿名函数 (function() { var baz = 1; var bim = function() { alert(baz); }; bar = function() { alert(baz); }; })(); console.log(baz); // baz 在函数外没有定义 bar(); // bar 在匿名函数外被定义 // 因为它没有描述为var;而且, // 因为它是作为 baz 在同一作用域中被定义的, // 它能访问 baz 即使其它代码 // 在函数之外 bim(); // bim 没有在匿名函数外定义, // 于是其结果将是一个错误
Copyright Rebecca Murphey, released under the Creative Commons Attribution-Share Alike 3.0 United States license.