テストを受ける:
<script>
function say() { alert( "ABOVE" ); }
say();
function say() { alert( "BELOW" ); }
</script>
- 結果はすべてのテスト (Chrome、Firefox、IE) で「BELOW」です。
- この場合、JavaScriptインタープリターはどのように機能しますか?
- http://jsfiddle.net/jcv6l/ << コードを実行します。
テストを受ける:
<script>
function say() { alert( "ABOVE" ); }
say();
function say() { alert( "BELOW" ); }
</script>
基本的に、すべての関数宣言を現在のスコープの一番上にプルする巻き上げのため、インタープリターは基本的にこれを行っています。
function say() { alert( "ABOVE" ); }
function say() { alert( "BELOW" ); }
say();
そのため、常にアラートが発生しますbelow
インタープリターは、最初に関数のすべての宣言を読み取り、次に関数の外にある他のステートメントを実行します。したがって、後者の宣言は前者をオーバーライドします。これが、後者が呼び出された理由です。
この場合、インタープリターは最初に関数定義を解析し、最後の関数定義が優先されます。
この質問は、次の場所でも回答されています: Javascript でのあいまいな関数宣言
ここにも良い記事があります: http://kangax.github.com/nfe/
(function () {
// even though not declared yet, every 'inner' function will be hoisted,
// and be available to the entire function
sing();
// variables are dealt with after functions, so say will be a string
// the order of declaration suggests this to be the case, but that isn't what matters
function say () { }
var say = "say";
// variables are dealt with after functions, so shout will be a string
// even though the order suggests shout should be a function
var shout = "shout";
function shout() { }
// both are functions, the latter one 'wins'
function sing() { console.log("sing1"); }
function sing() { console.log("sing2"); }
console.log(typeof say, typeof shout);
sing();
}())
出力:
sing2
string string
sing2
function xyz() { .. }
ブロックは解析時に定義されます。多くの関数が同じ名前を持つ場合、最後に定義された関数が優先されます。
ただし、実行時にステートメントを使用して関数を定義できます。
var say = function() { alert( "ABOVE" ); }
say();
say = function() { alert( "BELOW" ); }
を出力しますABOVE
。( JSFiddle )
これは、後者の関数が前の関数を上書きするためです。関数をログに記録しようとすると、次のようになります。
console.log(say);
以下のみを返します。
function say() { alert( "BELOW" ); }
「ABOVE」アラートは「BELOW」アラートに置き換えられました。同じスコープで同じ名前の変数を 2 回宣言するのと同様に、後者は前者を上書きします。
なんで?http://www.adequatygood.com/JavaScript-Scoping-and-Hoisting.htmlを参照してください。