2

アップデート:

質問が解決しました!その理由は「巻き上げ」によるものだと気づきました。基本的に、JavaScriptインタープリターはコードを解析し、関数の先頭ですべての変数を宣言します(ただし、それらは初期化しません)。そのため、2番目の例は機能しません。JavaScriptインタープリターvar changed;は関数の先頭で宣言しますが、コードの本体に到達するまで初期化しないためです。

最初の例のような関数宣言の場合、JavaScriptが2番目の例のように変数名だけを上に移動する代わりに、親関数の先頭で関数全体を上に移動(または「ホイスト」)します。これが機能する理由です。

とにかく、私は個人的な参照のためにこれを書きました、そして答えに感謝します...


これは機能します:http: //jsbin.com/emarat/7/edit

$(function(){
  $name = $('#test');
  $name.change(changedName);

  function changedName (e){
      console.log('e: ', e); 
      console.log('e.currentTarget: ', e.currentTarget); 
      console.log('$(e.currentTarget).val(): ', $(e.currentTarget).val());
      $('#test-display').text($(e.currentTarget).val());
    }
});

しかし、これはそうではありません:http: //jsbin.com/emarat/9/edit

$(function(){
  $name = $('#test');
  $name.change(changed);

  var changed = function(e){
      console.log('e: ', e); 
      console.log('e.currentTarget: ', e.currentTarget); 
      console.log('$(e.currentTarget).val(): ', $(e.currentTarget).val());
      $('#test-display').text($(e.currentTarget).val());
    };
});

なんで?

4

3 に答える 3

4

後者は次と同等です。

$(function(){
  var changed;
  $name = $('#test');
  $name.change(changed);

  changed = function(e){
      //...
    };
});

これにより、機能しない理由が明らかになります。使用時には、changed変数はまだ初期化されていません ( undefined)。

function yourFunctionName()ただし、構文を使用して関数を宣言すると、スコープ全体で使用できます。(JavaScript ではこれが親関数です。) そうしないと、関数を宣言する前に使用することができません。巻き上げと いう。

以下も参照してください。

于 2012-02-01T08:06:56.003 に答える
0

最初のものは、スコープ内の関数を定義します。2 つ目は、インライン関数を作成し、それへの参照をローカル変数に格納しますchanged。問題は、使用後に変数を埋めることです。

これはうまくいきます:

$(function(){
  var changed = function(e){
      console.log('e: ', e); 
      console.log('e.currentTarget: ', e.currentTarget); 
      console.log('$(e.currentTarget).val(): ', $(e.currentTarget).val());
      $('#test-display').text($(e.currentTarget).val());
  };

  $name = $('#test');
  $name.change(changed);
});

http://jsbin.com/emarat/11/edit

于 2012-02-01T08:12:46.810 に答える
0

変数は使用に定義されるためです。

var a = 1;
var c = a + b;
var b = 2;

そのコードが実行されるとは思わないでしょう。

于 2012-02-01T08:08:27.260 に答える