十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
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);
};
}
};