所有的面向对象语言都有某种形式的作用域(scope)。在JavaScript里,作用域是由函数划分的,而不是由块(block)划分(例如while,if和for语句)的。下面的代码演示了根据函数划分作用域
// 设置全局变量 foo,并置为 'test' var foo = "test"; // 在 if 块内部 if ( true ) { // 将 foo 置为 'new test' // 注意:现在还在全局作用域中 var foo = "new test"; } // 现在 fo 等于 'new test' alert( foo == "new test" ); // 创建一个会修改变量 foo 的新函数 function test() { var foo = "old test"; } // 然而在调用时,foo 只在函数作用域内起作用 test(); // 这里确认了 foo 还是等于 'new test' alert( foo == "new test" );
通过上面的代码可以看到,变量都在全局作用域中。在基于浏览器的JavaScript中,所有术语全局作用域的变量都是window对象的属性(property)。
// 全局作用域变量 var test = "test"; // 全局变量和 window 对象的 test 属性是一致的 alert( window.test == test );
最后,让我们看看当变量缺乏声明时会是什么情况。在JavaScript中,如果变量没有显式定义,它就是全局定义的,虽然它可能只在这个函数作用域的范围内使用。
// 一个设置了 foo 值的函数 function test() { foo = "test"; } //调用此函数以设置 foo 的值 test(); // 我们发现 foo 现在是在全局作用域下 alert( window.foo == "test" );
转载请注明:陈童的博客 » JavaScript的语言特性 — 作用域