您的位置:首页 > Web前端 > JavaScript

作用域(1)---Js作用域链及变量作用域

2015-10-20 17:44 489 查看
【转载】

要理解变量的作用域范围就得先理解作用域链 

用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性。 

作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是window对象的属性,所以这些对象的关系可以看作是一条链 

链头就是变量所处的对象,链尾就是window对象

看下面的代码:

function t() {
var a;
function t2() {
var b;
}
}


 

js中函数也是对象,所以变量a所在的对象是t,t又在window对象中,所以a的作用域链如下 

t--window 

那么b所以在的对象即t2,t2又包含在t中,t又在window对象,所以b的作用域链如下 

t2--t--window 

明白了作用域链下面就开始变量的作用域分析了 
       

1 javascript 没有var的变量都为全局变量,且为window对象的属性

function test1() {
//执行这个句的时候它会找作用域对象,这个函数就是作用域链中的第一个对象,但这个对象中没有相关的var语句
//于里就找作用域链的第二个对象,即全局对象,而全局对象中也没有相关的var语句
//由于没有相关的var语句,js隐式在函数地声明了变量即var all;
all = 30;
alert(all);
}

test1();

alert(all);
alert(window.all);


 

2 函数内(函数内的函数除外)定义的变量在整个函数内部都有效

function test2() {
var t = 0;
//在for的条件里定义变量,这个变更的作用域链对象是这个函数
//因此在整个的函数里它是有效的
for (var i = 0; i < 5; i++) {
t += i;
}
alert(i);
}
test2();


 

3 函数内部的变量取代全局同名变量

var t = "bb";
function test() {
//执行t的时候,它会先找作用域链对象,由于它定义在函数内部,所以这个函数就是它的作用域链的第一个对象
//而在这个对象里又有t的定义,所以t就是局部变量了,它替换了全局变量t

//t只是此时有定义,但并没有赋值,赋值在下一行,所以这里输出了undefined
alert(t);
var t = "aa";
alert(t);
}
test();


 

4 没块的作用域

 

if (true) {
//在块中定义了一个变量,它的作用域链的第一个对象就是全局对象window
var tmp = 0;
}
//tmp的作用域链的第一个对象就是全局对象window,而上面又有全局对象中相关的var语句,因此输出0
alert(tmp);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript