2

更新:

问题解决了!我意识到这是由于“吊装”造成的。基本上,JavaScript 解释器解析代码并在函数的开头声明所有变量(但不初始化它们)。这就是为什么第二个示例不起作用的原因。因为 JavaScript 解释器var changed;在函数的开头声明,但直到到达代码主体时才对其进行初始化。

对于像第一个示例这样的函数声明,JavaScript 不是像第二个示例那样仅向上移动变量名,而是在父函数的开头向上移动(或“提升”)整个函数,这就是它起作用的原因!

无论如何,我写这个供个人参考,谢谢你的答案......


这个有效: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

因为变量是在使用定义的。

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

您不会期望该代码能够运行。

于 2012-02-01T08:08:27.260 回答
0

第一个定义范围内的函数。第二个创建一个内联函数并将对它的引用存储在局部变量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 回答