2015-11-11 22 views
5

Working code sample.Kątowe nieoczekiwane zachowanie. Funkcja Self-wykonanie wywołuje funkcję zakres

Trivial znaczników:

<!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 przykładowy kod:

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 

}); 

I naprawdę dziwne zachowanie zakresu. Czy możesz wyjaśnić, dlaczego tak się dzieje?

+0

Jestem pewien, że znasz to j kodowanie specyficzne dla avascript ... tutaj jest przykład: jsfiddle.net/prfy9eso. Warto zauważyć, że interpretacja dla tego przykładu działa w inny sposób (puste linie zmieniają zachowanie kodu w drugim przykładzie, ale nie zmieniają zachowania w przykładach kątowych). – Spirit

+1

"return" [jest znanym wyjątkiem] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/return#Automatic_Semicolon_Insertion). Zwróć uwagę na "nieosiągalny kod po poleceniu zwrotu", dotyczy to tylko Firefoksa, ale użycie właściwie skonfigurowanego lintera może zapobiec obu sytuacjom. – estus

+0

Również 'throw',' continue', 'break'. [spec] (http://ecma-international.org/ecma-262/5.1/#sec-7.9) –

Odpowiedz

6

pan nieumyślnie popełnił test metoda zakres Iife, a obecny kod jest zasadniczo

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

Podczas $scope.test sama będzie undefined.

Powinno być

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

(function() {}()); 

średniki są cenne.

+1

Dobrze wytłumaczony estus..zaoceniony +1 –

+1

@PankajParkar, dzięki, odpowiedzi pojawiły się niemal jednocześnie. – estus

+0

ale twoja jest lepsza niż moja;) –

4

Po dodaniu kodu wpisz po $scope.test funkcji, Ma on () do niego. Tak z powodu, że jest test funkcja jest uważana za self wykonującego function,

Jak @estus już powiedział, że można uniknąć tego problemu przez kończąc swój kod funkcji przez ;.

Kod

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

Inne odpowiedź na średnikami nienawidzący:

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

!function(){}(); 

Jest to ogólna zasada ucieczki swoje Startline [/( jest kiedy piszesz średnik mniej styl:

;[].forEach.apply(arguments, iterator) 
;(function(){})() 
Powiązane problemy