闭包 - js作用域的问题
本文介绍了闭包 - 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
解决方案
var number = 2;//全局变量
var obj = {
number : 5,
fn1 : (function() {
console.log(this)//window
console.log(this.number)//2
this.number *= 2;//4
console.log(number)//undefined
number=number*2;
console.log(number)//NaN
var number=3;
return function() {
console.log(this)//Object {number: 5}
this.number *= 2;//10
number*=3;//9
console.log(number);
}
})()
};
var fn = obj.fn1;
fn(); //输出9
obj.fn1(); //输出27
fn1
的值现在是立即执行函数的结果就是那个 返回的函数,形成闭包,var fn = obj.fn1
//即将fn
和fn1
引用同一个函数fn()//执行立即函数
,return
函数时形成闭包,由于作用于链的原因,可以访问到外层变量的值,即number =3
,此后number*=3
改变number的值为9
由于闭包的原因这个值被保存了下来,
然后执行obj.fn1()
的时候 等于是 3*9
结果就是27了
再试试 在外面直接调用obj.fn1()
结果是跟预期没有差别的 是9
主要的原因还是那个IIFE自执行函数
形成了闭包
这篇关于闭包 - js作用域的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文