这段代码如何理解(关于作用域链和私有变量)

发布于 2022-09-02 13:00:17 字数 381 浏览 19 评论 0

(function(){
        function A(){
            var v = "a";
            this.getVar = function(){
                console.log(v);
            }
        }
        function B(){
            var v = "b";
            A.call(this);
        }
        var b = new B();
        b.getVar();  //a
    })();

求这段代码如何理解,为什么var v = "a";注释掉之后会报错,如果用作用域来理解不应该输出b吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(2

审判长 2022-09-09 13:00:17
this.getVar = function(){
    console.log(v);
}

其中的 v 会一直向上查找,直到 window。这里会查找 function A(),然后查找外面的自执行函数,之后再往上找到 window,都没有v

为何不是b,因为 v = bfunction B() 中,在function A()里找不到啊。

call 不会更改作用域,只会改变 this

那么修改一下

(function () {
    function A(){
        //var v = "a";
        var self = this;
        this.getVar = function(){
            console.log(self.v);
        }
    }

    function B(){
        this.v = "b";
        A.call(this);
    }

    var b = new B();
    b.getVar();  //b

})();
橪书 2022-09-09 13:00:17

这个是语法域决定的,而不是在运行的时候决定

A中查找v,只会查找A自己函数内定义的v

找不到,就去上一级找,即这个IIFE里面找,也没找到

再上,global里面也没找到,就报错了

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