如何解决如何避免在Javascript闭包中使用此代码段?
| 我每天在Javascript中使用此代码段(例如每天100次)对封闭对象进行封闭:Class.prototype.Method = function(arg){
var Ta = this;
var e = function(){
Ta.doSomething(arg);
};
};
有没有一种方法可以避免Ta变量,并且仍然引用\“ outer \”(这个单词正确吗?)对象?
解决方法
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指出的那样,“ 3”实际上是JavaScript规范新版本的一部分,已经被现代浏览器所采用:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
, 我不知道我会提倡这样做,但是您可以使用\“。bind()\”:
var e = function() {
this.doSomething(arg);
}.bind(this);
这样可以确保函数“ e”内的“ 5”值始终是周围上下文的“ 5”值。 new7ѭ功能可在较新的浏览器中使用,或通过类似于MDC网站上的polyfill的功能。
我宁愿保留这些局部变量,尤其是在设置事件处理程序和类似内容的复杂函数中;它有助于阐明代码层之间的关系。
, 我不相信那里。我一直都在做同样的事情。
, 我使用一个小型的自制框架轻松地使用原型继承,并且在此框架中,我拥有大约相同的代码段。我认为没有这个就没有办法。
现在的问题是:为什么不这样做呢?您认为这是不好的做法吗,为什么?
我使用的那段代码:
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。