请先看一下代码:
var scope = "global";
function f() {
alert(scope);//dispaly "undefined" not "global"
var scope = "local";//Vaeiable initized here,but defined everywhere
alert(scope);//display "local"
}
f();
为什么了?
局部变量在整个函数体都是有定义的,这意味着在整个函数体中隐藏了同名的全局变量。虽然局部变量在整个函数体都是定义的,但在执行var语句前,他是不会被初始化的,因此上面的函数f和下面的函数等价
/*
* js函数是一个对象,scope是仅供js引擎访问的内部属性,包括创建对象属性的集合
* 当一个函数创建后它的作用域链被填充,
* 每个内部对象是独一的,所以多次调用一个函数会导致多次创建
* 当函数运行过程中遇到一个变量要搜索作用域,
*/
function f() {
var scope;//局部变量在函数头声明
alert(scope); //此处该变量有定义,但值为 "undefined"
scope = "local"; //初始化变量并赋值
alert(scope);//此处该变量具有值
}
还有请注意:作用域链 都是与函数 或则说 对象有关,与普通的js语句无关,如 for(var i=0;i<5;i+=){..} 这里的i的作用域仍在函数里而不是for循环,for不会增加作用域链中的对象.
在javascript中作用域是由函数划分的,而不是由块划分(if、while、for)