从javascript一道闭包面试题说开去-创新互联-成都快上网建站

从javascript一道闭包面试题说开去-创新互联

这道题目比较经典了:从javascript一道闭包面
试题说开去
var a = 1;
function test(){
    a= 2;
return function(){
        console.log(a);
    }
var a = 3;
}
test()();

当时我回答出来了正确答案,但是在一系列追问之下露出了狐狸的尾巴。答案是2

创新互联公司长期为上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为东兴企业提供专业的成都网站设计、成都网站建设,东兴网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。

我当时认为test执行之后,a=2赋值给了全局,那么返回function时那里的a指的是window.a,就是2了。

实际上var a=3这一句是陷阱。 由于变量提升 a=2之前有一个var a的声明,这里的a变成了局部的值。

那么返回函数为什么输出2? 因为闭包,外层的变量对内部可见。

var a = 1;
function test(){
    a= 2; 
return function(){
        console.log(this.a);
    }
var a = 3;
}
test()();

加大一下难度,这里会输出什么呢?

由于已经知道var a=3是陷阱,而javascript的函数this默认情况是window,so答案是1.

var name = "The Window";   
  var object = {   
    name :"My Object",   
    getNameFunc :function(){ 
          console.log(this.name);
      return function(){   
        console.log(this.name);  
     };   
    }   
};   
object.getNameFunc()();

这里输出是

My Object

The Window.

闭包作用域在函数{}内,this在闭包内不能传递,改成下面这样才能都输出My Object.

 var name = "The Window";   
  var object = {   
    name :"My Object",   
    getNameFunc :function(){ 
          console.log(this.name);
var tmp= this;
      return function(){   
        console.log(tmp.name);  
     };   
    }   
};

网站题目:从javascript一道闭包面试题说开去-创新互联
分享链接:http://kswjz.com/article/ceoipi.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流