编写函数的不同方法会在JavaScript中产生不想要的效果?
更新: 问题解决了我意识到这是因为“提升”。基本上,JavaScript解释器在函数开始时解析代码并声明所有变量(但不初始化它们)。这就是第二个例子不起作用的原因。因为JavaScript解释器声明编写函数的不同方法会在JavaScript中产生不想要的效果?,javascript,scope,hoisting,Javascript,Scope,Hoisting,更新: 问题解决了我意识到这是因为“提升”。基本上,JavaScript解释器在函数开始时解析代码并声明所有变量(但不初始化它们)。这就是第二个例子不起作用的原因。因为JavaScript解释器声明var已更改在函数的开头,但在函数到达代码体之前,不会初始化它 对于函数声明(如第一个示例所示),它没有像第二个示例那样只向上移动变量名,而是在父函数的开头向上移动(或“提升”)整个函数,这就是它工作的原因 无论如何,我写这篇文章是为了个人参考,谢谢你的回答 这个有效: 但是这个没有: 为什么?后者
var已更改
在函数的开头,但在函数到达代码体之前,不会初始化它
对于函数声明(如第一个示例所示),它没有像第二个示例那样只向上移动变量名,而是在父函数的开头向上移动(或“提升”)整个函数,这就是它工作的原因
无论如何,我写这篇文章是为了个人参考,谢谢你的回答
这个有效: 但是这个没有:
为什么?后者相当于:
$(function(){
var changed;
$name = $('#test');
$name.change(changed);
changed = function(e){
//...
};
});
这就清楚了为什么它不起作用。使用时,更改的
变量尚未初始化(未定义的
)
但是,如果您使用函数yourFunctionName()
语法声明一个函数,它在整个范围内都是可用的。(在JavaScript中,它是父函数)否则就不可能在函数声明之前使用它们。这叫吊装
另见:
$(function(){
var changed;
$name = $('#test');
$name.change(changed);
changed = function(e){
//...
};
});
这就清楚了为什么它不起作用。使用时,更改的
变量尚未初始化(未定义的
)
但是,如果您使用函数yourFunctionName()
语法声明一个函数,它在整个范围内都是可用的。(在JavaScript中,它是父函数)否则就不可能在函数声明之前使用它们。这叫吊装
另见:
- 因为变量是在使用后定义的。
var a = 1;
var c = a + b;
var b = 2;
您不会期望该代码运行。因为变量是在使用之后定义的。
var a = 1;
var c = a + b;
var b = 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);
});
第一个定义了作用域中的函数。第二个函数创建一个内联函数,并将对它的引用存储在局部变量
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);
});
@Farmor不是空的,而是未定义的。@TomaszNurkiewicz:非常欢迎您-我一直在努力区分JavaScript中创建函数的两种方法,您在这里对提升的解释帮助我进一步理解了这一点。我只是想为像我这样的迟钝的大脑添加一些明确的细节。@Farmor不是空的,而是未定义的。@TomaszNurkiewicz:不客气,我在努力区分JavaScript中创建函数的两种方法,你在这里对提升的解释帮助我进一步理解了它。我只是想为像我这样的慢大脑添加一些明确的细节。