问题描述
||
首先,我试图在我的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() { ... };
};