从内部/私人功能调用公共功能?

从内部/私人功能调用公共功能?

问题描述:

只是想知道如果我失去了一些东西或没有,但我试图做到以下几点:从内部/私人功能调用公共功能?

(function() { 
    var thing = function() { 
     var doIt = function() { 
      console.log("just do it"); 
      this.updateValue(5); 
     }; 

     return { 
      updateValue: function(val) { 
       console.log('updating value: ' + val); 
      }, 

      go: function() { 
       doIt(); 
      } 
     } 
    }; 

    var t = thing(); 
    t.go(); 
}()) 

这将导致“只管去做”显示在控制台紧随其后的错误了B/C,它说“ updateValue“不是一个函数。我想知道,一个内部/私有函数(例如“doIt”)可以调用一个公共函数(例如“updateValue”)吗?也许这只是糟糕的设计,你永远不应该真的想这样做,我实际上已经重构了我的代码,以避免/不这样做,但我很好奇,如果这是可能的。

在此先感谢。

无论是使用呼叫/适用于明确指定this上下文(如@SLaks和@Alnitak)提到或者在一开始定义函数,然后将其添加为属性返回的对象:

var thing = function() { 
    var updateValue = function() { /* */ }, 
     doIt = function() { 
      console.log("just do it"); 
      updateValue(5); 
    }; 

    return { 
     updateValue: updateValue, // minor duplication here 
     go: function() { 
      doIt(); 
     } 
    }; 
}; 

如果未成年人重复惹恼了你,你也可以这样做:

var thing = function() { 
    var exposed = { 
     updateValue: function(val) { 
      console.log('updating value: ' + val); 
     }, 
     go: function() { 
      doIt(); 
     } 
    }, doIt = function() { 
     console.log("just do it"); 
     exposed.updateValue(5); 
    }; 

    return exposed; 
}; 
+1

感谢大家谁在那里的答案。 @SLaks和@Alnitak我明白你的意思了,谢谢指出。 @ andreas-grech - 我选择了你的回答作为“答案”b/c我喜欢“暴露”的想法,我只是将其命名为“api”:) – codecraig 2011-05-06 13:11:09

+0

我通常尽量避免使用“this”因为如果你对它不是很小心的话,它会咬你。 如果您想了解更多信息,请阅读以下内容:http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/ – 2011-05-06 14:09:29

写入doIt(),调用全局上下文中的函数,所以thiswindow对象。

您需要编写doIt.call(this)以传递您的this作为doIt的上下文。

+0

嘎,你补充说,虽然我正在写我的答案:) – Alnitak 2011-05-06 12:17:48

每个@SLaks答案,this在由doIt()调用时不正确。

相反,尝试:

doIt.call(this);