2015-11-11 4 views
5

Working code sample.Comportamento angolare imprevisto. la funzione self-executing chiama la funzione portata

markup Trivial:

<!DOCTYPE html> 
<html ng-app="APP"> 
<head></head> 
<body ng-controller="myController"> 

    <script src="angular.min.js"></script> 
    <script src="controller.js"></script> 
</body> 
</html> 

codice di Trivial di esempio:

angular.module('APP', []).controller('myController', function($scope) { 

    $scope.test = function() { 
     console.log('Weird behaviour!') 
    } 

    (function() {}()); //if you comment self-executing function console will be empty 

}); 

E davvero strano comportamento ambito. Puoi spiegare perché questo succede?

+0

Sono sicuro che lo sai questo stile di codice specifico per l'avascript ... ecco un esempio: jsfiddle.net/prfy9eso. È interessante notare che l'interpretazione per quell'esempio funziona in un modo diverso (le righe vuote modificano il comportamento del codice nel secondo esempio, ma non cambiano il comportamento nell'esempio angolare). – Spirit

+1

'return' [è un'eccezione nota] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/return#Automatic_Semicolon_Insertion). Si noti la nota su "codice irraggiungibile dopo dichiarazione di reso", riguarda solo Firefox, ma l'utilizzo di linter configurato correttamente può impedire entrambe le situazioni. – estus

+0

Anche 'throw',' continue', 'break'. [specifica] (http://ecma-international.org/ecma-262/5.1/#sec-7.9) –

risposta

6

Hai involontariamente fatto test metodo ambito IIFE, e l'attuale codice è essenzialmente

$scope.test = (function() { 
    console.log('Weird behaviour!') 
})(undefined) 

Mentre $scope.test stesso sarà undefined.

Dovrebbe essere

$scope.test = function() { 
    console.log('Weird behaviour!') 
}; 

(function() {}()); 

virgola sono preziosi.

+1

Ben spiegato estus..appreciato +1 –

+1

@PankajParkar, grazie, le risposte sono apparse quasi contemporaneamente. – estus

+0

ma il tuo è migliore del mio;) –

4

Come è stato aggiunto il codice di scrittura dopo la funzione $scope.test, esso dispone di (). Quindi, a causa di che si tratta test funzione viene considerato come self esecuzione function,

Come @estus già detto si poteva evitare quel problema mettendo fine il codice funzione con ;.

Codice

$scope.test = function() { 
    console.log('Weird behaviour!') 
}(function() {}()) 
1

Altro risposta per punto e virgola-haters: regola generale

$scope.test = function() { 
    console.log('Weird behaviour!') 
} 

!function(){}(); 

E 'per sfuggire al tuo startline [/( 's quando si scrive meno virgola stile:

;[].forEach.apply(arguments, iterator) 
;(function(){})()