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

阅读 2.6k
2 个回答
    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自执行函数形成了闭包

  1. 第一题是因为闭包那部分外面的函数只有在赋值的时候执行了一次,并不是每次调用内部的函数外部的函数都会重新调用。

  2. 第二题也是相同的原理,如果道题改成

 function a(){
            var aa=1;var bb=2;
            return function b(){
                b+=1;//原来没有进行赋值操作
                console.log(b);
            }
        }
        b=a();
        b();  //3
        b();  //4

这道题和作用域关系其实并不大。。。希望楼主少研究这些脑残问题。面试会一两道也就算了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进