我是JavaScript新手,我有一个困惑 因为我们总是教导返回语句后的代码无法访问 但在下面的情况下并非如此,我无法理解为什么会如此。
function foo() {
//define bar once
function bar() {
return 3;
}
//redefine it
function bar() {
return 8;
}
//return its invocation
return bar(); //8
}
alert(foo());
http://jsfiddle.net/jainhimanshu/euga4mcy/
输出为8但应为3。
所以任何人都可以清楚这个概念。
答案 0 :(得分:4)
这是因为你要调用函数从中获取return
值。
未调用函数bar
,仅定义它。
因此,当函数foo()
被调用时
return bar();
执行foo
的并返回8
。
编译器看到foo
如下(覆盖bar
后):
function foo() {
function bar() {
return 8;
}
return bar();
}
alert(foo());
当达到return bar()
时,调用函数bar
并返回它的值。
调用bar
function foo() {
return 8;
}
alert(foo());
答案 1 :(得分:0)
function foo(){
// ....
}
创建新的Function object,并指定受让人名称foo
。它仍然没有被调用,只是被创建,所以任何return语句都不会被触发。
在此功能中,您可以创建新的Functions
,例如
function foo(){
function bar() {
return 3;
}
return 4;
}
// after you execute foo
console.log(foo()); // will log 4
但非常重要的是,在这个词法范围内,创建了函数bar
,但没有执行。另请参阅Lexical scope
但是当你有这个
function foo(){
function bar(){
return 3;
}
function bar() {
return 8;
}
return bar();
}
// after you execute foo
console.log(foo()); // will log 8
在foo
范围内执行函数global
时,会创建名为bar
的Function对象,然后创建名为bar
的新Function对象,重新定义旧对象,与为variable
分配新值相同,值更改,但在此上下文中,分配给函数名称的函数体已更改。
由于您的函数foo
具有return
关键字,因此会返回该值。它返回的值是返回函数bar
的值,因为return bar();
将执行函数bar
并返回它从函数bar
接收的值,例如它是值8。 / p>
将变量重定义与函数重定义进行比较
var a;
a = "some string";
a = 5; // a has value 5, no mater older values
// same goes for functions
function bar(){ .... }
function bar(){ .... }
function bar(){ .... }
// invoke bar
bar(); // last function bar will be executed, no mater other function's bar definitions