js作用域的问题

发布于 2022-09-04 17:36:04 字数 728 浏览 15 评论 0

作用域疑惑代码如下,

    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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

黄昏下泛黄的笔记 2022-09-11 17:36:04
    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自执行函数形成了闭包

超可爱的懒熊 2022-09-11 17:36:04
  1. 第一题是因为闭包那部分外面的函数只有在赋值的时候执行了一次,并不是每次调用内部的函数外部的函数都会重新调用。

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文