2015-11-11 13 views
5

Working code sample.Angulares unerwartetes Verhalten. Self-executing-Funktion aufruft Scope-Funktion

Trivial Markup:

<!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> 

Trivial Codebeispiel:

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 

}); 

Und wirklich seltsam Umfang Verhalten. Kannst du mir bitte erklären, warum das passiert?

+0

ich bin sicher, dass Sie diese j kennen Avascript-spezifischer Code-Stil ... hier ein Beispiel: jsfiddle.net/prfy9eso. Es ist interessant, dass für dieses Beispiel der Interpretation zu beachten, arbeitet auf eine andere Art und Weise (Leerzeilen Code Verhalten im zweiten Beispiel zu ändern, aber nicht das Verhalten im Winkel Beispiel ändern). – Spirit

+1

'return' [ist eine bekannte Ausnahme] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/return#Automatic_Semicolon_Insertion). Beachten Sie den Hinweis zu "Unerreichbarer Code nach Return-Anweisung", es betrifft nur Firefox, aber die Verwendung von richtig konfigurierten Filtern kann beide Situationen verhindern. – estus

+0

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

Antwort

6

Sie haben versehentlich test Umfang Methode IIFE gemacht, und der aktuelle Code ist im Wesentlichen

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

Während $scope.test selbst undefined sein wird.

Es sollte

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

(function() {}()); 

Semikolons wertvoll sind sein.

+1

Nun erklärt estus..appreciated +1 –

+1

@PankajParkar, danke, die Antworten fast gleichzeitig erschienen. – estus

+0

aber deins ist besser als meins;) –

4

Wie Sie Code schreiben, nachdem $scope.test Funktion hinzugefügt, hat es () zu. Also aus diesem Grunde ist es test Funktion wird als selffunction Ausführung

Wie @estus bereits gesagt, Sie durch Beenden Sie Ihren Funktionscode durch ;, dass Problem vermeiden können.

-Code

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

Andere Antwort für Semikolon Hasser:

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

!function(){}(); 

Es ist allgemeine Regel Ihre Startlinie [/( ‚s zu entkommen, wenn Sie Semikolons weniger Stil schreiben:

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