var confirm = confirm('Are you sure?');
我刚刚测试了这个语句,结果出现了错误,提示confirm
不是一个函数。
我立即发现变量名重写了它。但我的问题是为什么?
我知道函数是一等公民,声明与函数同名的变量将在相关范围内覆盖它。但我的困惑来自于我认为执行顺序是“从右到左”的,即在确定目标之前进行函数调用。
在这种情况下,变量是否在函数调用之前被定义?
var confirm = confirm('Are you sure?');
我刚刚测试了这个语句,结果出现了错误,提示confirm
不是一个函数。
我立即发现变量名重写了它。但我的问题是为什么?
我知道函数是一等公民,声明与函数同名的变量将在相关范围内覆盖它。但我的困惑来自于我认为执行顺序是“从右到左”的,即在确定目标之前进行函数调用。
在这种情况下,变量是否在函数调用之前被定义?
function myFunction() {
// ...
var confirm = confirm('Are you sure?');
// ...
}
becomes :
function myFunction() {
var confirm;
// ...
confirm = confirm('Are you sure?');
// ...
}
function myFunction() {
// ...
var confirm = window.confirm('Are you sure?');
// ...
}
confirm()
函数并不是一个很好的主意。你应该使用var confirmResult = window.confirm('Are you sure?');
来保持代码整洁。 - deitch
undefined
。请了解JS变量"提升"。 - nnnnnnvar
不是可执行语句,也不受自上而下、自右向左或任何其他执行顺序规则的限制。它是一个声明,正如@nnnnn所说,会被提升。 - user663031confirm
的变量。原帖作者(很可能)期望的是函数调用window.confirm()
。 - nnnnnnfunction confirm() {}
声明了confirm
,var confirm
就不会重新声明它。同样,如果您有多个var confirm
,第二个及其后续的都不会重新声明它。(还要注意的是,如果您只想提示用户,根本不需要变量,只需if (confirm('Are you sure?')) { /* do something */ }
即可)。 - nnnnnn