在JavaScript中,声明函数中的变量,为什么函数获得更高的优先级?
function bar() {
return foo;
foo = 10;
function foo() {}
var foo = 11;
}
console.log(typeof bar());
的typeof酒吧回报功能? 为什么不能编号?
在JavaScript中,声明函数中的变量,为什么函数获得更高的优先级?
function bar() {
return foo;
foo = 10;
function foo() {}
var foo = 11;
}
console.log(typeof bar());
的typeof酒吧回报功能? 为什么不能编号?
JS功能在两遍三次通过执行。首先,引擎遍历代码,查找函数声明并提升它们(=将它们移动到顶部),其次,它提升变量声明(除非已经有相同的名称),最后它运行“规范化”代码。
在您的代码片段中,引擎选择function foo
并将其移动到该函数的顶部。后续的var foo
被忽略。
这将导致在下面的 “正常化” 代码:
function bar() {
function foo() {}
return foo;
foo = 10;
foo = 11;
}
这就解释了你的结果。
参考:Declaration Binding Instantiation,请注意步骤5和8。
为什么'function bar(){ 返回foo; foo = 10; foo = function foo(){} var foo = 11; } 的console.log(typeof运算巴());''登录undefined'? – guest271314
@ guest271314:谢谢,我添加了“声明”一词:function _declarations_首先被挂起。你的定义只是一个普通的价值。 – georg
'不能决定foo是全局还是本地',如果它不是本地的,那么它会使它成为全局的? –
return foo
到function foo() {}
只是引用,这样它的返回Function
function bar() {
return foo; // function foo() {}
foo = 10;
function foo() {}
var foo = 11;
}
alert(typeof bar()); // function
另一个场景
function bar() {
return foo; // returns foo undefined as no value is assigned
foo = 10;
var foo = function() {} // referenced to variable
var foo = 11;
}
alert(typeof bar()) // undefined
在这里它将返回数
function bar() {
foo = 10;
return foo; // 10
function foo() {}
var foo = 11;
}
alert(typeof bar()); // number 10
这也将返回它返回一个闭合功能号码
function bar() {
foo = 10;
return function() {
return foo
}
var foo = 11;
}
alert(typeof bar()()); // number 10
你搞砸了回报:)。
这不是关于优先级。这是关于你最后从函数返回的东西。改变他们,看看。你得到号码。
function bar() {
function foo() {}
var foo = 11;
return foo;
foo = 10;
}
alert(typeof bar());
要在此展开,我想你也触犯运行某些[吊装]的(https://developer.mozilla.org/en-US/docs/Glossary/Hoisting)是复杂的问题... –
其原因行为是由于在JavaScript吊装。
当JavaScript解释,任何变量定义,首先处理,所以在您的函数的范围,呼叫的实际顺序是像这样:
function bar {
var foo = 11;
function foo() {}
return foo;
}
的吊装位置var foo = 11
声明首先,然后foo
被foo命名的函数覆盖。因此return foo
返回函数本身,而不是数值。
我认为你大部分都是正确的,但变量_declaration_被吊起来了,但是__不是赋值。这是'typeof function'赢得胜利的真正原因。 –
我不认为这是正确的,'var foo'根本没有处理。 – georg
好的,我明白了......但你认为它应该是:var foo; (){} return foo; foo = 11; –
功能被提升到当前作用域的顶部,因此,要在执行时的代码将看起来像
function bar() {
var foo;
function foo() {}
return foo;
foo = 10;
function foo() {}
foo = 11;
}
console.log(typeof bar());
的return
声明防止编号分配执行,但函数声明并不关心。
function bar() {
return foo;
foo = 10; //assignment is never executed
function foo() {} //function definition happens even if code is not executed
var foo = 11; //assignment is never executed
}
console.log(typeof bar());
为了验证这一点,注释掉function foo() {}
线。您会看到bar()
返回undefined
。赋值语句定义,即使不执行的语句foo
,但直到它们被执行(因此留在原位的功能定义),他们不揍的foo
值。
该代码是一个烂摊子......我不知道你想achiev。它返回函数的原因是,因为你正在返回空的foo()函数而没有任何返回值。 **算法连续工作,但函数没有连续声明**。 –
记住1规则,js编译器在顶部的上下文中移动函数声明。该键解决所有查询 –