微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript名称空间和事件侦听器中的“ this”问题

如何解决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 举报,一经查实,本站将立刻删除。