javascript变量作用域

时间:2021-05-31 16:08:15

把《javascript高级程序设计》的变量和函数部分翻了一遍,感觉可以找些题看看了。遂找了写经典题目,逐一解析(第二题踩坑了~)

先看题http://blog.csdn.net/YoungerChen/article/details/7934008

均在非严格模式下:

1.

var a = 10;  
function test() {  
    a = 100;  
    alert(a);  
    alert(this.a);  
    var a;  
    alert(a);  
}  
test(); 

分析:全局变量var a = 10;此时 window.a=10;

注意在方法内有var a;有个很重要的概念:变量声明提前。所有上述代码等同于

var a = 10;  
function test() { var a = 100; alert(a); alert(this.a); alert(a); } test(); 

所以函数内的局部变量a的作用域在函数内,this.a=window.a。所有输出为100 10 100;

2.

var a = 100;  
function test(){  
    alert(a);  
    var a = 10;  
    alert(a);  
}  
test(); 

声明提前后的代码为:

var a = 100;  
function test(){  
    var a;
    alert(a);  
    a = 10;  
    alert(a);  
}  
test(); 

大坑(声明提前,赋值不提前)。默认值为undefined 所以正确答案为undefined 10

3.

var a = 100;    
function test(){    
    alert(a);    
    a = 10;  //去掉了var 就变成定义了全局变量了  
    alert(a);    
}    
test();   
alert(a);

这个就很简单了。函数内调用全局变量a。 输出 100 10 10

 

引申到函数。函数声明和函数表达式,

function say(){
  //函数声明  提前
}

var say = function(){
  //函数表达式  声明提前但值不提前
}

example:

say();//hi
function say(){
  console.log('hi');  
}
say();//error
var say = function(){
  console.log('hi');  
}

 

总结:

1.函数内局部变量在函数执行完后就会销毁(闭包除外)

2.函数内的this值向允许函数时的对象

3.var声明提前;值不会提前