如何在Javascript闭包中避免使用此代码段?

时间:2011-06-14 12:52:25

标签: javascript closures

我在Javascript中使用这个代码片段,每天100次,以封闭对象:

Class.prototype.Method = function(arg){
    var Ta = this;
    var e = function(){
        Ta.doSomething(arg);
    };
};

有没有办法避免Ta变量并仍然引用“外部”(这个词是否正确?)对象?

4 个答案:

答案 0 :(得分:3)

我不知道我主张这是优越的,但你可以使用“.bind()”:

var e = function() {
  this.doSomething(arg);
}.bind(this);

确保函数“e”内的this值始终为周围上下文的this值。 The .bind() function is available in newer browsers, or via a polyfill like the one on the MDC site.

我更喜欢保留那些局部变量,特别是在设置事件处理程序和类似东西的复杂函数中;它有助于澄清代码层之间的关系。

答案 1 :(得分:2)

a)您可以继续使用此方法使用更有意义的变量名称。使用that是一种常见的约定 - 它表示您的变量只是另一个“this”值,但是对于另一个函数范围。

b)您可以使用函数绑定实用程序。一些JavaScript库附带一个。或者你可以自己动手:

function bind(fn, scope) {
    return function () {
        fn.apply(scope, arguments);
    };
}

// for your example:
Class.prototype.Method = function(arg) {
    var e = bind(function() {
        this.doSomething(arg);
    }, this);
};

// Alternatively, extend the Function prototype (may raise some eyebrows):

Function.prototype.bind = function (scope) {
    var fn = this;
    return function () {
        fn.apply(scope, arguments);
    };
};

// for your example:
Class.prototype.Method = function(arg) {
    var e = function() {
        this.doSomething(arg);
    }.bind(this);
};

<强>更新 正如@Pointy指出的那样,bind实际上是JavaScript规范新版本的一部分,现已被现代浏览器所接受:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

答案 2 :(得分:0)

我不相信有。我一直在做同样的事情。

答案 3 :(得分:0)

我使用一个小的自制框架来轻松使用原型继承,在这个框架中我有大约相同的代码片段。我认为没有这个没有办法。

现在的问题是:为什么不这样做?你认为这是一种不好的做法,为什么?

我使用的代码:

function getCallback(obj, methodName) {
    var method = obj[methodName];

    function callback() {
        if (obj[methodName] === callback) {
            return method.apply(obj, arguments);
        }
        return obj[methodName].apply(obj, arguments);
    }

    return callback;
}