js作用域的问题
作用域疑惑代码如下,
var number = 2;
var obj = {number : 5,
fn1 : (function() {
this.number *= 2;
number=number*2;
var number=3;
return function() {
this.number *= 2;
number*=3;
console.log(number);
}
})()
};
var fn1 = obj.fn1;
fn1(); //输出9
obj.fn1(); //输出27
不明白为什么第二次输出为27,不是也应该为9吗,毕竟var number=3;赋值了啊
function a(){
var aa=1;var bb=2;
return function b(){
console.log(bb+1);
}
}
b=a();
b(); //3
b(); //3
这就是2次都输输出3
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
fn1
的值现在是立即执行函数的结果就是那个 返回的函数,形成闭包,var fn = obj.fn1
//即将fn
和fn1
引用同一个函数fn()//执行立即函数
,return
函数时形成闭包,由于作用于链的原因,可以访问到外层变量的值,即number =3
,此后number*=3
改变number的值为9
由于闭包的原因这个值被保存了下来,然后执行
obj.fn1()
的时候 等于是3*9
结果就是27了再试试 在外面直接调用
obj.fn1()
结果是跟预期没有差别的 是9
主要的原因还是那个
IIFE自执行函数
形成了闭包
第一题是因为闭包那部分外面的函数只有在赋值的时候执行了一次,并不是每次调用内部的函数外部的函数都会重新调用。
第二题也是相同的原理,如果道题改成
这道题和作用域关系其实并不大。。。希望楼主少研究这些脑残问题。面试会一两道也就算了。