-4
<html>
  <head>
    <title></title>
  <script type="text/javascript">  
    var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}

</script>
  </head>
  <body>
<script type="text/javascript">
b();
alert(a);
</script>
  </body>
</html>

私は c と Java のバックグラウンドから来ています。Java スクリプトではスコープ ルールが異なります。このプログラムが出力 1 を出す理由を知りたいです。このプログラムがどのように機能しているか。

4

4 に答える 4

4

JavaScript は関数スコープを使用します。また、関数はそのスコープの一番上 (最も近い関数) に「巻き上げ」られます。

function b() {
    a = 10;
    return;
    function a() {}
}

これは次のように解釈されます。

function b() {
    function a() {}  // function was hoisted
    a = 10;
    return;
}

関数を使用して宣言するfunction a(){}と、そこにあったようにvar見えます。ローカル変数を作成しています。したがって、はグローバルではなくa=10ローカルです。aa

参照: http://www.adequatygood.com/2010/2/JavaScript-Scoping-and-Hoisting

于 2012-09-24T18:43:24.093 に答える
3

ここでは 2 つのことが組み合わされています。変数のスコープ、および関数内で関数と変数を宣言する方法。

bという名前の関数内でローカル関数を宣言してaいるため、グローバルスコープで同じ名前で変数をシャドウする関数内でローカル変数を宣言するのと同じ効果があります。

関数内のどこにローカル変数/関数を作成しても問題ありません。関数内のコードが開始する前に作成されるため、次のようにします。

function b() {
  a = 10;
  return;
  function a() {}
}

基本的には次と同じです:

function b() {
  var a = function(){};
  a = 10;
  return;
}

関数内のコードが10変数aに値を代入すると、実際にはローカル関数が上書きされ、数値に置き換えられます。Javascript の関数参照はファースト クラス メンバーであるため、他の値と同様に渡すことができ、他の値に置き換えることもできます。

関数内のコードはローカル変数のみを変更するためa、グローバル変数aは変更されません。

于 2012-09-24T18:46:24.787 に答える
1

JavaScript では、スコープ ユニットは関数です。あなたのb関数でaは、ローカル関数です。したがって、グローバルa変数は影響を受けません。

于 2012-09-24T18:42:58.503 に答える
0

Javascript 言語でのスコーピングについては、http ://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting を参照してください。

于 2012-09-24T18:43:07.470 に答える