作用域
概念:变量的有效范围
栗子:
var a = 10;
function fn() {
alert(a)
}
function fn1(){
var a=20;
fn()
}
fn1(); // 10
a =10 是全局的 而a=20 是局部的
var a=10
function fn(){
alert(a);
var a=20
}
fn(); // undefined,一是预解析,二是就近查找。
变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。
var a = 10
function fn(){
alert(a)
a=20
}
fn(); // 10
这个虽然是就近原则,但是就近找var声明的变量,因为a= 20 没有var声明,只是修改了a 的值,所以到外面去找了,输出的是10。不过没错的是a=20后,a确实为20了,只不过alert的时候还没有执行到那~~
var a = 10
function fn(){
a=20
alert(a)
}
fn(); // 20
var a=10
function fn(){
fn1();
alert(a);
function fn1(){
var a=20
}
}
fn(); // 10
var a=10;
function fn(a){
alert(a)
var a= 20;
}
fn(a) // 10
作用域链
一般情况下,变量取值到创建这个变量的函数的作用域中取值。但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的。