变量声明在函数声明之前是否有优先权?

问题描述:

我测试了以下代码:变量声明在函数声明之前是否有优先权?

(function(){ 
    var x = false; 
    function x(){ 
    return true; 
    } 
    return typeof x; 
})(); 

它返回 “布尔”。只有当我评论第二行时:

(function(){ 
    //var x = false; 
    function x(){ 
    return true; 
    } 
    return typeof x; 
})(); 

它返回“功能”。 这意味着如果某人之前在代码的某处声明了一个变量,那么使用相同名称的函数声明将会失败,对吧?请有人向我解释。 谢谢!

在JavaScript中,函数声明被视为先写入。然后是变量声明。 (如果有的话,这种特定的排序很少)

在变量声明中,任何赋值部分都被视为发生在函数中实际出现var语句的位置的单独表达式语句。因此:

function foo() { 
    // ... some code ... 
    if (whatever) { 
    var x = whatever + 1; 
    } 
} 

是像对待:

function foo() { 
    var x; 
    // ... some code ... 
    if (whatever) { 
    x = whatever + 1; 
    } 
} 

因此整体就好像它是你的第一个样品处理:

(function() { 
    function x() { 
    return true; 
    } 
    var x; 
    x = false; 
    return typeof x; 
})(); 

还要注意函数和变量都有一个共同的名字空间。对于已声明的变量名没有赋值部分的var声明不起作用。 (至少,我认为它没有意义的效果,但JavaScript有奇怪的黑角......)

+0

不知道,谢谢! – paperstreet7

+0

我希望函数声明能够转换成首先写入的函数表达式赋值?即代码被视为'var x; x =函数x(){...}; x = false; ...' – Bergi

+0

@Bergi我觉得JavaScript引擎是免费的,但这两者并不完全一样。在function函数和形式参数的左括号之间的函数实例化中提供的名称与函数中的代码绑定,与函数中的代码无关。它(类似于)Lisp中的'letrec'。 (不过,我不知道是否可以构建一个显示差异的示例。) – Pointy