2

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

我并不热衷于使用this来调用其他函数,但直到最近,它已经奏效了。但是,我已经为某些元素添加了事件侦听器,它们被解释this为目标对象。

我知道我可以使用完整的命名空间而不是this调用侦听Ish.Com.View.publicFunction2()器(我需要在几乎每个函数调用中使用整个命名空间。

如何让命名空间与事件侦听器很好地配合使用?我也对实现命名空间的更好方法感兴趣,因为 usingthis.publicFunction2()很笨重。

我对最佳实践非常感兴趣,并学习如何用 JavaScript 编写架构良好的应用程序。但是,除非我对 JavaScript 有更透彻的了解,否则框架是不可能的。

4

3 回答 3

4

好像我今天早上一直在以同样的方式回答每个问题:-)

您可以使用“.bind()”:

   var eventHandler = yourObject.someFunction.bind(yourObject);

这将保证this每当“eventHandler”被任何东西调用时都会引用“yourObject”。

“bind()”函数位于较新浏览器中的 Function.prototype 对象上。Mozilla 文档包含一个可靠的“bind()”实现,您可以使用它来修补旧版浏览器。

“bind()” 所做的是返回一个新函数,该函数明确安排this按照您的规定进行绑定。如果您愿意,您还可以传递要传入的参数。使用“bind()”的替代方法是将函数调用包装在您自己的匿名函数中:

  var eventHandler = function() { yourObject.someFunction(); };
于 2011-05-31T14:36:48.407 回答
0

我不知道我是否完全理解了你的问题。这会满足你的需要吗?

var obj = new function() {
    var scope = this;

    this.fun1 = function() {
        return scope.fun2();
    }

    this.fun2 = function() {
        //do sth
    }
};
于 2011-05-31T15:00:18.017 回答
0

这是由变量上下文和闭包引起的。“ this ”总是指当前对象。事件函数本身就是一个对象,“ this ”指的是那个对象。如果您需要引用父对象,您可以使用前面描述的绑定,或者将父对象“ 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() { ... };
};
于 2011-05-31T15:02:00.260 回答