更新
问题解决了!我意识到这是因为'吊装'。基本上,JavaScript解释器解析代码并在函数开头声明所有变量(但不初始化它们)。这就是为什么第二个例子不起作用的原因。因为JavaScript解释器在函数的开头声明var changed;
,但是不会初始化它,直到它到达代码的主体。
对于像第一个例子那样的函数声明,而不是像第二个例子那样向上移动变量名称,它向上移动(或“升起”)向上移动整个函数在父函数的开头,这就是它工作的原因!
无论如何,我写这篇文章仅供个人参考,感谢答案......
这个有效: 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());
};
});
为什么吗
答案 0 :(得分:4)
后者相当于:
$(function(){
var changed;
$name = $('#test');
$name.change(changed);
changed = function(e){
//...
};
});
这使得它无法正常工作变得明显。在使用时,changed
变量尚未初始化(undefined
)。
但是如果使用function yourFunctionName()
语法声明一个函数,它在整个范围中都可用。 (在JavaScript中,它是父函数。)否则,在声明之前不可能使用函数。它被称为吊装。
答案 1 :(得分:0)
因为变量在 之后定义<。>
var a = 1;
var c = a + b;
var b = 2;
您不希望该代码运行。
答案 2 :(得分: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);
});