为什么以下代码输出4?任何人都可以向我推荐一篇很好的文章来深入学习javascript范围。
这段代码返回4但我不明白为什么?
(function f(){
return f();
function f(){
alert(4);
};
var f = function (){
alert(5);
};
})();
但是这段代码片段会返回5.为什么?
(function f(){
var f = function (){
alert(5);
};
return f();
function f(){
alert(4);
};
})();
最后一个返回4.我没有得到它。
(function f(){
function f(){
alert(4);
};
return f();
var f = function (){
alert(5);
};
})();
为什么return f();
不会调用父函数f()?
答案 0 :(得分:1)
这与范围无关,它与entering an execution context时发生的事情有关。
简而言之,当输入执行上下文(例如函数)时,将创建变量并为其指定undefined值。变量声明如:
var f = 5;
创建变量 f ,但是值5
不会被分配,直到运行时并执行该语句。
然后处理函数声明,它有效地创建一个具有该名称的局部变量,并将函数体指定为其值。
然后开始执行。
发生了更多的事情,但这是重要的部分。
以下内容:
// The optional name creates a local variable f at parse time that
// references this function. In some buggy versions of IE, it also creates
// a global f variable that references the function.
(function f(){
// This is the only statement in f's execution context that is executed.
return f();
// This defines a function f at parse time, after the variable declaration below,
// and overriding the initial f created
// above, immediately before any code is executed. It is this
// function that is executed by the return statement
function f(){
alert(4);
};
// The variable declaration is processed before the above function declaration
// and before any code is run. But since f
// already exists because of the optional name, it has no effect.
// Since this is below the return, the assignment is never executed.
var f = function (){
alert(5);
};
})();
适用于其他例子。
(function f(){
// Everything happens as above, but because this assignment is before the
// return, it happens after variable function declarations, so when
// executed it replaces the function created by the function declaration below.
var f = function (){
alert(5);
};
return f();
// This function is created before any code is executed, but is over ridden
// by the assignment above at runtime
function f(){
alert(4);
};
})();
最后一个:
(function f(){
function f(){
alert(4);
};
return f();
// As with the first, this assignment never happens so
// when f is called above, it calls the function created by
// the function declaration.
var f = function (){
alert(5);
};
})();
答案 1 :(得分:0)
以下函数在解析时定义。
function f(){
//code
};
以下函数在运行时定义。
var f = function(){
//code
};
在第一个例子中,在解析之后,f的值应该警告4.在返回f()之后写入f的赋值(重写)。因此,分配永远不会发生,最终输出为4。
在第二个例子中,在解析之后,f的值应该警告4.但是在返回f()之前写入f的赋值(重写)。因此最终输出为5。
在第三个例子中,在解析之后,f的值应该警告4.在返回f()之后写入f的赋值(重写)。因此,分配永远不会发生,最终输出为4。