如何解决JavaScript名称空间和事件侦听器中的“ this”问题
|| 首先,我试图在我的JavaScript程序中使用伪命名空间,如下所示:// Ish.Com namespace declaration
var Ish = Ish || {};
Ish.Com = Ish.Com || {};
// begin Ish.Com.View namespace
Ish.Com.View = new function() {
var privateVariable;
this.publicFunction = function() {
this.publicFunction2()
};
this.publicFunction2 = function() { ... };
};
我对使用ѭ1调用其他函数并不感到疯狂,但是直到最近,它仍然有效。但是,我在某些元素上添加了事件侦听器,并且它们将“ 1”解释为目标对象。
我知道我可以使用完整的名称空间而不是this
来调用我的侦听器内部的函数(Ish.Com.View.publicFunction2()
),但是侦听器通常会调用一个函数,然后调用另一个函数。我几乎需要在每个函数调用中使用整个命名空间。
如何使名称空间与事件侦听器良好配合?我还对实现名称空间的更好方法感兴趣,因为使用this.publicFunction2()
很麻烦。
我对最佳实践非常感兴趣,并学习如何使用JavaScript编写结构良好的应用程序。但是,直到我对JavaScript有了更透彻的了解之前,框架才成为问题。
解决方法
好像我今天早上一直在用同样的方式回答每个问题:-)
您可以使用\“。bind()\”:
var eventHandler = yourObject.someFunction.bind(yourObject);
这样可以保证无论何时调用“ eventHandler \”时,this
都将引用“ yourObject \”。
较新的浏览器中的Function.prototype对象上具有\“ bind()\”函数。 Mozilla文档包括\“ bind()\”的可靠实现,可用于修补较旧的浏览器。
\“ bind()\”的作用是为您返回一个新函数,该函数显式地安排您按规定绑定this
。如果愿意,还可以传递要传递的参数。使用\“ bind()\”的替代方法是将函数调用包装在您自己的匿名函数中:
var eventHandler = function() { yourObject.someFunction(); };
, 我不知道我是否完全理解你的问题。
这适合您的需求吗?
var obj = new function() {
var scope = this;
this.fun1 = function() {
return scope.fun2();
}
this.fun2 = function() {
//do sth
}
};
, 这是由可变上下文和闭包引起的。 \“ this \”始终指当前对象。事件函数本身就是一个对象,\“ this \”引用该对象。如果需要引用父对象,则可以按前面所述使用bind,或者将父\“ this \”设置为变量,然后在事件函数中使用它。
// Ish.Com namespace declaration
var Ish = Ish || {};
Ish.Com = Ish.Com || {};
// begin Ish.Com.View namespace
Ish.Com.View = new function() {
var privateVariable,thisObj=this;
this.publicFunction = function() {
thisObj.publicFunction2()
};
this.publicFunction2 = function() { ... };
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。