2014-11-21 39 views
4
var confirm = confirm('Are you sure?'); 

我刚刚测试了这个声明,并且给出了一个错误,指出confirm不是函数。Javascript Statement执行命令

我立即检测到变量名称正在覆盖它。然而我的问题是为什么?

我知道函数是第一类,并且声明与函数同名的变量将在相对范围内覆盖它。但是我的困惑来自于我认为是从右到左的执行顺序,I.E.函数调用在确定目标之前进行。

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

+3

_“是否变量成为在这种情况下在函数调用之前定义?“_ - 是的。在给定范围内,所有变量都在该范围内的代码执行之前被定义,并且它们最初被赋予值“undefined”。阅读JS变量“提升”。 – nnnnnn 2014-11-21 11:36:37

+0

在这里看起来很好http://jsfiddle.net/batug0o5/1/ – 2014-11-21 11:39:37

+1

'var'不是可执行语句,受制于从上到下或从右到左的规则或任何其他执行顺序。这是一个**声明**,正如@nnnnn所说,它已经被挂起。 – 2014-11-21 11:40:34

回答

6

由于JavaScript的变量提升:

function myFunction() { 
    // ... 
    var confirm = confirm('Are you sure?'); 
    // ... 
} 

变为:

function myFunction() { 
    var confirm; 
    // ... 
    confirm = confirm('Are you sure?'); 
    // ... 
} 

您将需要执行以下操作来执行你的意思:

function myFunction() { 
    // ... 
    var confirm = window.confirm('Are you sure?'); 
    // ... 
} 
+1

在任何情况下,重写'confirm()'函数都不是一个好主意。你可能应该有'var confirmResult = window.confirm('你确定?');'保持清洁 – deitch 2014-11-21 11:44:22

+0

@deitch这是我的一部分,我已经改名为变量。我只是想知道是什么导致了这种行为:) – Flosculus 2014-11-21 11:46:46

+1

明白了。我认为@Phylogenesis做了一个很好的解释与变量提升。 – deitch 2014-11-21 11:47:49