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() { ... };
};
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...