可能重复:
Why does second function declaration win even though I return before it?
我想了解一件事。在实现任何函数或输出之前,JS是否首先通过代码来初始化变量,函数等?我的意思是看起来它经历了两次代码 - 一次初始化,并且只是第二次开始做某事。正确?
我有这样的代码:
alert( (function f() {
function f() { return 1 }
return f();
function f() { return 2 }
})() );
输出为2.因此,如果它从第一次开始直接实现代码,则输出将为1.但是,只要输出为2,它首先检查代码,然后才开始使用它。我是对的吗?
答案 0 :(得分:4)
Javascript确实“悬挂”。这基本上意味着任何var name
或function name()
被提升到它声明的任何函数体的顶部。所以你的例子可以像这样重写,它遵循提升规则。
var f;
f = function() {
var f;
f = function() { return 1; };
f = function() { return 2; }; // hoisted!
return f();
};
alert(f());
这里发生的是在外部范围内,您创建一个局部变量f
。然后为其分配一个函数,然后执行该函数。
在函数内部,我们创建一个新的局部变量f
,其中阴影外部变量,使其无法访问。我们现在有一个完全不同的f
只存在于这个内部函数中。我们为它分配了第一个函数,然后是第二个提升函数。现在我们执行我们的函数体。
因此,由于提升,您几乎不想使用function name() {}
语法来创建函数。相反,使用var name = function() {}
创建函数。
它更易于控制和理解,因为声明变量并为其赋值,现在是两个独立的操作。变量声明仍然被提升,但在它到达为其分配函数的代码行之前它不会有值,这通常是你真正想要的。
答案 1 :(得分:1)
var
和function
。这是我将函数定义为
的主要原因
f = function()
代替function f()
- 这样我确切地知道在哪里定义了什么。