【问题标题】:Trouble With JS ClosureJS关闭问题
【发布时间】:2011-04-05 17:23:48
【问题描述】:

我有这个js:

(function () {

    Namespace = {

        settings: {
            myVar: 'test' 
        },

        init: function() {

            var memberSearchFrm = document.getElementById('memberSearch');
            memberSearchFrm.onsubmit = function() {

                this.someOtherFunction(); // doesn't work
                console.log(this.settings.myVar); // doesn't work 
            }
         },

        someOtherFunction: function() {
            console.log('test');  
        }
    }

    Namespace.init();
})();

当我进入我的 onSubmit 函数时,我失去了“this”的上下文。您能帮我理解为什么会发生这种情况以及如何解决这种情况吗?

【问题讨论】:

    标签: javascript oop closures


    【解决方案1】:

    试试这个那个把戏。

    在你关闭之前设置一个名为 'that' 的变量给 this。

    var that = this;
    

    然后在你的闭包中使用它。您遇到的问题是闭包附加到您的 DOM 节点而不是您的对象。因此,当您调用闭包时,它具有 DOM 节点的值。

    【讨论】:

    • 我建议称它为self
    • 我也更喜欢 self,但我认为“那”是一种更像 Java 的解决方案,每个人都希望 JavaScript 成为 Java。
    • self 也是 javascript 中引用当前窗口的关键字 - jsfiddle.net/GvKZ4
    • 如果你使用 var self = this 而不是 self 只在函数范围内。
    【解决方案2】:

    memberSearchFrm.onsubmit 内部,this 指的是memberSearchFrm,而不是你想要的对象。您需要保存对this 的引用。

        init: function() {
            var that = this;
            var memberSearchFrm = document.getElementById('memberSearch');
            memberSearchFrm.onsubmit = function() {
                that.someOtherFunction();
                console.log(that.settings.myVar); 
            }
         },
    

    【讨论】:

      【解决方案3】:

      我在闭包中遇到了同样的问题,并制作了这个小提琴来尝试不同的方法来调用闭包中的其他函数。

      http://jsfiddle.net/7FzEz/5/

      我终于确定了这个格式:

      (function () {
      
           var obj = {
      
              settings: {
                  myVar: 'test' 
              },
      
              init: function() {
      
                  var memberSearchFrm = document.getElementById('memberSearch');
                  memberSearchFrm.onsubmit = function() {
      
                      obj.someOtherFunction(); 
                      console.log(obj.settings.myVar);  
                  }
               },
      
              someOtherFunction: function() {
                  console.log('test');  
              }
          }
      
          obj.init();
      })();
      

      【讨论】:

      • Namespace 只是在我的示例中使用的占位符名称。放入 var 有什么好处?无论哪种方式都可以,j / c ...
      • 实际上,您的情况没有,因为您处于匿名包装器中,我将在此处对其进行编辑。当您不在匿名包装器中时,这很重要 - 请在此处查看范围内的全局变量的祸根:bonsaiden.github.com/JavaScript-Garden/#function.scopes
      • 现在我收回它,添加 var 确实会有所作为,因为它可以防止您污染全局名称空间:jsfiddle.net/vtPuE
      • 当然......如果你想在全局上下文中将它分配给那个命名空间,你不想要 var 这可能是你想要的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      • 2013-11-12
      • 2017-11-09
      • 2019-03-18
      • 2022-01-23
      相关资源
      最近更新 更多