2012-03-28 62 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 

})();