js 变量作用域

问题

今天有人发了一个网站,问题来源


if (!("a" in window)) {  
    var a = 1;
}
console.log(a);  

按照这种思路就可解,变量声明会被提前,也就是说上面的代码等价于下面代码

var a;  
if (!("a" in window)) {  
    a = 1;
}
console.log(a);  
//所以a未定义,打印为undefined

var a = 1,  
    b = function a(x) {
        x && a(--x);
    };
console.log(a);  

同样代码,声明提前,等价如下代码

var a;  
function a(x) {  
    x && a(--x);
};
a = 1;  
console.log(a);  
//打印为 1

function a(x) {  
    return x * 2;
}
var a;  
console.log(a);  

同样变

var a;  
function a(x) {  
    return x * 2;
}
console.log(a);  
//打印函数a的内容

function b(x, y, a) {  
    arguments[2] = 10;
    console.log(a);
}
b(1, 2, 3);  

arguments就是输入的参数数组,argument是引用
上面的代码可以按照下面这么理解

function b() {  
    arguments[2] = 10;

    //每次用x, y, a的时候,都是重新去arguments数组里面去取
    var x = arguments[0];
    var y = arguments[1];
    var a = arguments[2];
    console.log(a);
}
b(1, 2, 3);  
//打印为 10

function a() {  
    alert(this);
}
a.call(null);  
//打印为 Windows对象

大坑,记住下面一句话

apply/call传null或者undefined,指向的window对象,this指向全局对象  

未经授权,禁止转载
by chainhelen