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
但是,当你有一个名为bar
这个
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
新的函数对象,旧的被重新定义,与为variable
分配新值相同,值更改,但在此上下文中,分配给函数名称的函数体发生了更改。
因为您的功能foo
有return
关键字,它会返回该值。它返回的值是返回函数bar
的值,因为return bar();
将执行函数bar
并返回从函数bar
收到的值,例如它的值为8。
比较变量的重新定义与功能的重新定义
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
从本质上讲,你说:'X = 3'然后'X = 8'。那么为什么你期待'x == 3'? – Johan
@Johan对不起,但没有。它永远不会说'x = 3'。第一个函数从未被调用,因为它被第二个函数覆盖。 – Archer
@Archer很好,'bar = 3'然后'bar = 8'然后'return bar' ...正是我所说的和上面写的。 – Johan