为什么我在构造函数中附加`this`的变量会失去绑定?

时间:2014-11-21 18:02:56

标签: javascript

我真的打败了这个人。我无法弄清楚javascript的绑定是如何工作的。在我班级的构造函数中,我设置var self = this;,我认为这将永远给我一个绝对的实例引用。然而,这似乎并非如此。

以下是我班级的主要结构。

var MyClass = (function() {
    function MyClass(data) {
        var self = this; 
        this._element = $('.someSelector');   
    }

    MyClass.prototype.styleIt = function() {
        self._element.css('display', 'block'); 
    }
    return MyClass;

})();

在另一个包含MyClass实例的类中,我调用styleIt函数如下:

Class2:
...
    $('#id').click(function(evt) {
        evt.preventDefault(); 
        for (int i = 0; i < self._objects.length; i++) {
            [i].styleIt(); 
        }
    }

然而,令我感到困惑的是self styleIt window内的{{1}}!这里发生了什么?

1 个答案:

答案 0 :(得分:0)

self在内部MyClass函数内部定义,因此仅在该范围内可见。您的styleIt方法未在该范围内定义,因此无法查看self变量。

如果你希望你的方法是自引用的(例如不依赖于this),那么你必须在构造函数中定义方法(而不是在原型上),这样他们就可以看到{{1}变量。

以下是一种方法:

self

在您的代码中调用var MyClass = (function() { function MyClass(data) { var self = this; this._element = $('.someSelector'); this.styleIt = function() { self._element.css('display', 'block'); return self; } } })(); ,如下所示:

styleIt()

这段代码根本不正确(两个编码错误),不应该需要上面的自引用功能。这段代码可以像这样完成:

$('#id').click(function(evt) {
    evt.preventDefault(); 
    for (int i = 0; i < self._objects.length; i++) {
        [i].styleIt(); 
    }
}

使用$('#id').click(function(evt) { evt.preventDefault(); for (var i = 0; i < self._objects.length; i++) { self._objects[i].styleIt(); } } obj.method()调用方法时,会在方法内设置为this,因此您不需要obj功能self 1}}方法。您可以依赖styleIt()

的值