JavaScript语句执行顺序

5
var confirm = confirm('Are you sure?');

我刚刚测试了这个语句,结果出现了错误,提示confirm不是一个函数。

我立即发现变量名重写了它。但我的问题是为什么?

我知道函数是一等公民,声明与函数同名的变量将在相关范围内覆盖它。但我的困惑来自于我认为执行顺序是“从右到左”的,即在确定目标之前进行函数调用。

在这种情况下,变量是否在函数调用之前被定义?


3
"在这种情况下,函数调用之前变量是否变得已定义?" - 是的。在给定作用域内,在该作用域中的代码执行之前,所有变量都被定义,并且最初赋予值undefined。请了解JS变量"提升"。 - nnnnnn
这里看起来很好 http://jsfiddle.net/batug0o5/1/ - Naeem Shaikh
1
var 不是可执行语句,也不受自上而下、自右向左或任何其他执行顺序规则的限制。它是一个声明,正如@nnnnn所说,会被提升。 - user663031
@Naeem-Shaikh - 这个与您的小样不同,因为您的小样中同时有函数声明和一个名为 confirm 的变量。原帖作者(很可能)期望的是函数调用 window.confirm() - nnnnnn
1
函数声明有点像变量声明。因此,一旦通过function confirm() {}声明了confirmvar confirm就不会重新声明它。同样,如果您有多个var confirm,第二个及其后续的都不会重新声明它。(还要注意的是,如果您只想提示用户,根本不需要变量,只需if (confirm('Are you sure?')) { /* do something */ }即可)。 - nnnnnn
显示剩余2条评论
1个回答

7
由于JavaScript的变量提升特性:
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?');
    // ...
}

1
无论如何,像那样覆盖confirm()函数并不是一个很好的主意。你应该使用var confirmResult = window.confirm('Are you sure?');来保持代码整洁。 - deitch
@deitch 这是我的疏忽,我已经重新命名了变量。我只是想知道是什么导致了这种行为 :) - Flosculus
1
明白了。我认为@Phylogenesis用变量提升解释得很好。 - deitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接