2015-11-11 4 views
5

Working code sample.予期しない角度のある動作。自己実行機能簡易マークアップ

スコープ関数を呼び出します。

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

簡易コードサンプル:

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 

}); 

そして、本当に奇妙なスコープの挙動。なぜこれが起こるのか説明していただけますか?

+0

このjを知っていると思いますavascript固有のコードスタイル...ここに例があります:jsfiddle.net/prfy9eso。興味深いことに、この例の解釈は異なる方法で行われます(空白行はコード例を2番目の例で変更しますが、例の動作を変更しません)。 – Spirit

+1

'return' [既知の例外](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/return#Automatic_Semicolon_Insertion)。 「リターンステートメントの後の到達不能なコード」の注記に注目してください。これはFirefoxのみに関係しますが、適切に設定されたリンターを使用すると両方の状況を防ぐことができます。 – estus

+0

また、 'throw'、' continue'、 'break'です。 [仕様](http://ecma-international.org/ecma-262/5.1/#sec-7.9) –

答えて

6

あなたは意図せずtestスコープ方式の生命維持を作った、と$scope.test自体がundefinedなりますが、現在のコードは、基本的に

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

です。

それは

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

(function() {}()); 

セミコロンは貴重ですでなければなりません。

+1

よく説明されたestus..appreciated +1 –

+1

@PankajParkar、ありがとう、答えはほぼ同時に現れました。 – estus

+0

があなたのものより優れている;) –

4

$scope.testの機能の後にコードを追加したので、それには()があります。だから、それはそれで@estusがすでに;によってあなたの関数のコードを終了することにより、その問題を避けることができると言いましたようtest機能はfunctionを実行self

と考えられるため。

コード

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

セミコロン嫌いのための他の答え:

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

!function(){}(); 

それはあなたがセミコロンレススタイルを書くとき、あなたのするStartLine [/(年代を逃れるために一般的なルールです:

;[].forEach.apply(arguments, iterator) 
;(function(){})() 
関連する問題