javascript - 如何在 javascript 闭包中将 'this' 保留在类中

标签 javascript closures

我已阅读 this answerIIFE但我似乎找不到解决问题的正确方法。

我这里有一个简单的类:

define(['jquery'], function($) {
    // Need 'self' because someCallback() is being called with .call() and 'this' changes
    var self;

    function Foo(number) {
        self = this;
        this.someNumber = number;
    }

    Foo.prototype = {
        someCallback: function () {
            //Use self because 'this' changes to a DOM element
            var num = self.someNumber;

            //Do something with the num
            return num * 2;
        }
    };

    return Foo;
});

someCallBack() 由 jQuery 插件使用 .call() 调用。因此,上下文发生了变化,因此使用了 self 变量。

但是,这是错误的,因为:

define(['foo'], function(Foo) {
    describe('context question', function () {
        var foo1 = new Foo(1);
        var foo2 = new Foo(2);

        it('"this" should work', function () {
            var call1 = foo1.someCallback.call(this); // 4
            var call2 = foo2.someCallback.call(this); // 4

            expect(call2).toBe(4); // Only works because it is 'new' last
            expect(call1).toBe(2); // Fails because 'self' is taken from foo2
        });
    });
});

我应该如何包装 self 变量才能使这段代码正常工作?

最佳答案

您可能只使用 revealing module pattern并将其声明为“全局”变量(模块本地):

define(['jquery'], function($) {
    var someNumber;

    function Foo(number) {
        someNumber = number;
    }

    Foo.prototype = {
        someCallback: function () {
            return someNumber * 2;
        }
    };

    return Foo;
});

关于javascript - 如何在 javascript 闭包中将 'this' 保留在类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35514527/

相关文章:

javascript - 检查日期是今天、昨天还是过去 7 天

javascript - 使用 JavaScript 一次显示一个 <p>

java - 这是缓存关闭线程保存吗?

javascript - 在 Javascript 中返回 MyClass 的 ID

javascript - javascript 闭包中的环境范围

javascript - 如何从后台线程启动 Chrome 扩展弹出窗口?

javascript - “this”在 Node 环境中的行为与浏览器不同

javascript - 如何 knockout svg 文本元素?

javascript - 如何在 Javascript 匿名函数中提供默认参数?

javascript - 使用 eval() 的奇怪闭包行为——为什么?