2012-03-28 134 views
2

我有一個名爲bbUI.js的文件,它包含了這一點JavaScript。在該文件之外,我希望能夠調用「var x = new iScroll(...)」,但是我目前得到錯誤「ReferenceError:Can not find variable:iScroll」。訪問在匿名函數中聲明的函數?

(function(){ 
var iScroll = function (el, options) { 
     var that = this, 
      doc = document, 
      i; 

     // More code 
    }; 
})(); 

從我可以告訴,iScroll是一個匿名函數中定義的,而且本身匿名,但分配給該標識符iScroll。如果這是準確的,我應該能夠在代碼的其他地方調用「var x = new iScroll(...)」嗎?

回答

4

iScroll函數只存在於它所包含的匿名函數的範圍內。要在其他地方使用它,您需要使其成爲全局函數。

您可以通過刪除其包裹的功能或在匿名函數中設置window.iScroll = iScroll來使其成爲全局。

+0

+1:從來沒有想過的'window.foo'伎倆。好一個。 – Blender 2012-03-28 16:08:41

3

卸下匿名函數,它包裝的代碼:

(function(){ // <- this 
    ... 
})();   // <- this 

匿名功能防止了代碼從污染全局變量,所以iScroll僅內的匿名函數定義。

1

對這個問題的回答取決於你真正想達到什麼以及自我執行功能的目的。無論如何..這裏iScroll是在自我執行功能,你必須使它在外面的範圍。我已經給出了以下兩種方法來做到這一點。

要麼只是讓全球除去var關鍵字

(function(){ 
iScroll = function (el, options) { 
     var that = this, 
      doc = document, 
      i; 

     this.show = function(){ 
      alert("hello world"); 
     } 
    }; 

})(); 

或添加變量iScroll外部和返回功能。

var iScroll = (function(){ 
     return function (el, options) { 
      var that = this, 
       doc = document, 
       i; 

      this.show = function(){ 
       alert("hello world"); 
      } 
     }; 
})(); 

測試

var iscroll = new iScroll(); 
iscroll.show(); 
1

另一種選擇可能是以下幾點:

var iScroll = (function(){ 

    var iScroll = function (el, options) { 
    }; 

    return iScroll; // <-- add this line 

})();