2012-03-28 13 views
2

Ich habe eine Datei namens bbUI.js, die dieses Bit JavaScript enthält. Außerhalb dieser Datei würde ich gerne "var x = new iScroll (...)" aufrufen können, aber ich erhalte den Fehler "ReferenceError: Variable nicht finden: iScroll".Zugriff auf eine in einer anonymen Funktion deklarierte Funktion?

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

     // More code 
    }; 
})(); 

Von dem, was ich sagen kann, ist iScroll innerhalb einer anonymen Funktion definiert, und ist selbst anonym, sondern auf die Kennung iScroll zugeordnet. Wenn das stimmt, sollte ich "var x = new iScroll (...)" an anderen Stellen in meinem Code aufrufen können?

Antwort

4

Die Funktion iScroll existiert nur im Rahmen der anonymen Funktion, in die sie eingebettet ist. Um sie an anderer Stelle zu verwenden, müssen Sie sie global machen.

Sie können es global machen, indem Sie die eingefügte Funktion entfernen oder window.iScroll = iScroll in die anonyme Funktion setzen.

+0

+1: nie gedacht, über den 'window.foo' Trick. Schön. – Blender

3

die anonyme Funktion entfernen, die den Code hüllt:

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

Die anonyme Funktion, dass Code verhindert, dass die globalen Variablen von der Verschmutzung, so wird iScroll innerhalb dieser anonymen Funktion nur definiert.

1

Die Antwort auf diese Frage hängt davon ab, was Sie wirklich erreichen wollen und was der Zweck einer selbstausführenden Funktion ist. Wie auch immer .. hier ist iScroll innerhalb der selbstausführenden Funktion und Sie müssen es im Bereich außerhalb verfügbar machen. Ich habe unten zwei Methoden angegeben, um dies zu tun.

Entweder es nur global machen, indem var Stichwort

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

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

})(); 

oder durch eine variable iScroll externe Zugabe und die Funktion zurückkehrt.

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

Eine weitere Möglichkeit zu testen, die folgend sein:

var iScroll = (function(){ 

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

    return iScroll; // <-- add this line 

})(); 
Verwandte Themen