首页 新闻 会员 周边 捐助

js闭包问题

0
悬赏园豆:20 [已解决问题] 解决于 2015-08-11 08:08

请看下面两段代码,解释一下输出值。

var a = 1;
function b() {
var a = 2;
function c() {
console.log(a);
}

return c;
}

b()();

为什么输出是2;这里的console.log(a),与console.log(this.a)有什么区别。

 

var a = 1;
function b() {
var a = 2;
function c() {
console.log(this.a);//不同的地方
}

return c;
}

b()();

上面一段又不一样,这点比较好理解,执行环境是全局变量,所以输出的是1.

路西恩的主页 路西恩 | 菜鸟二级 | 园豆:371
提问于:2015-08-04 07:38
< >
分享
最佳答案
0

前者输出为2其实很好理解,因为局部变量覆盖了全局变量,当函数执行到b时候,首先在自己(b)的上下文查找a,如果存在a就停止向上搜索,如果不存在就会找到位于最顶层的全局变量a了,所以这里就输出为2而不是你预设的全局变量 a( =1)了

 

至于如果在变量a前加上this,那就相当于限定输出了,因为在大多数独立的函数内部,this是指向全局空间的,所以这里this.a 就输出1了,然后衍生下就是你需要理解下this在不同场景中指向(可能是全局也可能是函数自身上下文)

收获园豆:18
visonme | 小虾三级 |园豆:1674 | 2015-08-04 07:50

这里补充一个例子,说明下this在不同场景下代表的上下文

//example
function VisonP(){
    function globalThis()
    {
        console.log( this ) ; //  指向全局
    }


    this.selfThis =  function(){
        console.log( this );  //执行函数对象(visonP自身);
    }

    this.showGlobaThis = function(){
        globalThis();
    }
    
};

var ob  = new VisonP();
ob.selfThis():
ob.showGlobaThis();

 

visonme | 园豆:1674 (小虾三级) | 2015-08-04 07:55

@visonme: 

var a = 1;
function b() {
var a = 2;
console.log(a);//你解释的是这种情况
function c() {
console.log(a);
}

return c;
}
b()();//这种情况反馈的是函数式编程的闭包问题
var a=b();
a();

你虽没有回答到问题的点,但是要谢谢。

路西恩 | 园豆:371 (菜鸟二级) | 2015-08-11 08:07
其他回答(1)
0

程序都是从"上到下"执行的:

在"类"里面 public class person{}

     方法里面使用:this,指的是当前类(person)

在"html"中使用:this,也表示当前对象,例如 <span onclick(this)></span>这里的this就是指 span对象

收获园豆:2
唯我独萌 | 园豆:537 (小虾三级) | 2015-08-05 08:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册