在返回私有函数之前发生作用域泄漏

Scope leaking before private function is returned

本文关键字:作用域 泄漏 返回 函数      更新时间:2023-09-26

我正在学习javascript中的绑定,测试代码如下

    var text = "Global Text";
    var FooObj = {
        text: "Foo text",
        GetText: function () {
            return this.text;
        }
    };
    function BarObject() {
        var text = "Private Bar Text";
        var BarGetText = FooObj.GetText;
        alert(f());
        return {
            text: "Public Bar Text",
            GetText: BarGetText,
            f: f
        }
        function f() {
            var text = "Bar f() text";
            var t = BarGetText();
            return t;
        }
    }
    var obj = BarObject(); // Global Text is alerted
    alert(obj.GetText()); //Public Bar Text Text is alerted
    alert(obj.f()); // Global Text is alerted

由于在obj的初始化中调用了f(),我希望在FooObj中引用this.Text时会引用"Private Bar Text"。非常奇怪的是,全局范围中的文本被调用,这与FooObj和BarObject无关。有人能解释为什么吗?

这里的问题是如何根据函数的实际调用方式应用范围。您应该参考this:的MDN页面

在函数内部,它的值取决于函数的调用方式。

function f1(){
    return this;
}
f1() === window; // global object

this在构造函数的f()调用中引用window的原因是它是一个裸调用。后两个调用的区别本质上是相同的。t的值将始终是全局文本,因为对BarGetText的调用是一个"简单调用",无论您传递多少对象和作用域,它都不会更改。