我在Javascript中使用这个代码片段,每天100次,以封闭对象:
Class.prototype.Method = function(arg){
var Ta = this;
var e = function(){
Ta.doSomething(arg);
};
};
有没有办法避免Ta变量并仍然引用“外部”(这个词是否正确?)对象?
答案 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;
}