js 脑补

06 Jan 2016 Category: Javascript

js的变量作用域,根据不同的定义位置分为全局变量以及局部变量。同事, 任何没有用var定义的变量都是全局变量。如果没有局部变量,则寻找全局变量。 但是需要注意一点,函数域优于全局域,当变量调用语句在函数域内,同时函数域中也存在 局部变量,则使用的是局部变量,不管调用时,变量是否定义。


var a = 123;//全局变量
function test(){
    alert(a);//弹出undefined,因为此时局部变量a还为定义;
    var a = 1;
    alert(a);//弹出1;
}

如果把函数中var a = 1;注释掉,则会弹出两次123

函数和闭包


function test()
{
    var a = [];
    var i = 0;
    for(i=0;i<3;i++)
    {
        a[i] = function(){
            return i;
        }
    }
    return a;
}

var f = test();
console.log(f[0]);//输出3
console.log(f[1]);//输出3
console.log(f[2]);//输出3

控制台输出 3,3,3

说明: a[i],这里的i是循环的时候就已经确定了。


function(){
    return i;
}

这里的i是test函数执行完之后,即循环三次之后的i,因此i=3;

如果想要是想a[0] = 0;需要在函数定义的时候,将i作为参数传入函数中。


function test()
{
    var a = [];
    var i = 0;
    for(i=0;i<3;i++)
    {
        a[i] = (function(x){
            return x;
        })(i)
    }
    return a;
}

var f = test();
console.log(f[0]);//输出0
console.log(f[1]);//输出1
console.log(f[2]);//输出2