JS作用域链

1、JavaScript的全局变量和局部变量

(1) 全局变量

js的全局变量也可以看做window对象的属性。
  如果在函数中定义变量时没有用关键字var,那么实际上定义的就是全局变量。

(2)局部变量

要说块级作用域,那么在js中就只有函数块,函数中定义的变量就是局部变量,当然必须有关键字var!(没有关键字var定义的都是全局变量)

也就是说if else语句和for循环中创建的变量在外部都可以访问的到

function foo(){ var x = 1;
} for(var i = 0;i<10;i++){

} if(i){ var y = 10;
}
foo();
alert(i);//10
alert(y);//10
alert(x);//error x is not defined

2、作用域链

var x = 1; function foo(){ var y = 2; function bar(){ var z = 3;
        alert(x+y+z);
    }
    bar();
}
foo();

在bar函数中没有y和z,执行x+y+z时,js搜索x,y,z变量的一种机制就是作用域链,这个例子的搜索顺序:bar->foo->window

bar的作用域链是:

**barScopeChain = [
    bar.AO,
    foo.AO,
    global.VO
];**

foo的作用域链是:

fooScopeChain = [
    foo.AO,
    global.VO
];

在函数执行过程中,每遇到一个变量,都会检索从哪里获取和存储数据,该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没有则继续搜索作用域链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义,函数执行过程中,每个标识符都要经历这样的搜索过程。

你可能感兴趣的:(JS作用域链)