2011-05-06 97 views
1

只是想知道如果我失去了一些東西或沒有,但我試圖做到以下幾點:從內部/私人功能調用公共功能?

(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」)嗎?也許這只是糟糕的設計,你永遠不應該真的想這樣做,我實際上已經重構了我的代碼,以避免/不這樣做,但我很好奇,如果這是可能的。

在此先感謝。

回答

1

無論是使用呼叫/適用於明確指定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

0

寫入doIt(),調用全局上下文中的函數,所以thiswindow對象。

您需要編寫doIt.call(this)以傳遞您的this作爲doIt的上下文。

+0

嘎,你補充說,雖然我正在寫我的答案:) – Alnitak 2011-05-06 12:17:48

-1

每個@SLaks答案,this在由doIt()調用時不正確。

相反,嘗試:

doIt.call(this);