我测试了以下代码:
(function(){
var x = false;
function x(){
return true;
}
return typeof x;
})();
返回“boolean”。只有当我评论第二行时:
(function(){
//var x = false;
function x(){
return true;
}
return typeof x;
})();
返回“功能”。 这意味着如果有人在之前的代码中某处声明了变量,那么使用相同名称的函数声明将失败,对吧?请有人向我解释一下。 谢谢!
答案 0 :(得分:4)
在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有奇怪的黑暗角落......)