闭包 - js作用域的问题

查看:164
本文介绍了闭包 - 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 //即将fnfn1引用同一个函数
fn()//执行立即函数return函数时形成闭包,由于作用于链的原因,可以访问到外层变量的值,即number =3,此后number*=3 改变number的值为9 由于闭包的原因这个值被保存了下来,
然后执行obj.fn1()的时候 等于是 3*9 结果就是27了

再试试 在外面直接调用obj.fn1() 结果是跟预期没有差别的 是9
主要的原因还是那个IIFE自执行函数形成了闭包

这篇关于闭包 - js作用域的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆