3

テストを受ける:

<script>
    function say() { alert( "ABOVE" ); }

    say();

    function say() { alert( "BELOW" ); }
</script>
  • 結果はすべてのテスト (Chrome、Firefox、IE) で「BELOW」です。
  • この場合、JavaScriptインタープリターはどのように機能しますか?
  • http://jsfiddle.net/jcv6l/ << コードを実行します。
4

6 に答える 6

3

基本的に、すべての関数宣言を現在のスコープの一番上にプルする巻き上げのため、インタープリターは基本的にこれを行っています。

function say() { alert( "ABOVE" ); }
function say() { alert( "BELOW" ); }
say();

そのため、常にアラートが発生しますbelow

于 2013-04-04T11:52:26.917 に答える
1

インタープリターは、最初に関数のすべての宣言を読み取り、次に関数の外にある他のステートメントを実行します。したがって、後者の宣言は前者をオーバーライドします。これが、後者が呼び出された理由です。

于 2013-04-04T11:54:47.940 に答える
1

この場合、インタープリターは最初に関数定義を解析し、最後の関数定義が優先されます。

この質問は、次の場所でも回答されています: Javascript でのあいまいな関数宣言

ここにも良い記事があります: http://kangax.github.com/nfe/

于 2013-04-04T11:55:22.237 に答える
1
(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
于 2013-04-04T11:57:24.950 に答える
0

function xyz() { .. }ブロックは解析時に定義されます。多くの関数が同じ名前を持つ場合、最後に定義された関数が優先されます。


ただし、実行時にステートメントを使用して関数を定義できます。

var say = function() { alert( "ABOVE" ); }
say(); 
say = function() { alert( "BELOW" ); }

を出力しますABOVE。( JSFiddle )

于 2013-04-04T11:58:36.483 に答える
0

これは、後者の関数が前の関数を上書きするためです。関数をログに記録しようとすると、次のようになります。

console.log(say);

以下のみを返します。

function say() { alert( "BELOW" ); } 

「ABOVE」アラートは「BELOW」アラートに置き換えられました。同じスコープで同じ名前の変数を 2 回宣言するのと同様に、後者は前者を上書きします。

JSFiddle の例

なんで?http://www.adequatygood.com/JavaScript-Scoping-and-Hoisting.htmlを参照してください。

于 2013-04-04T11:52:00.043 に答える