2017-04-19 19 views
0

在书中You Don't Know JS: Scope & Closures有这样的代码我不完全理解。有条件的函数声明

“出现正常的区块内通常举到封闭的范围,而不是有条件的,因为这意味着代码函数声明:”

foo(); // "b" 

var a = true; 
if (a) { 
    function foo() { console.log("a"); } 
} 
else { 
    function foo() { console.log("b"); } 
} 

是什么意思?这怎么可能?条件不起作用吗?

+1

引用的语句不正确。 – RobG

+1

*“这是什么意思?”*这意味着功能声明与其他地方一样悬而未决。 *“条件不起作用吗?”*正在工作,但在任何代码执行之前发生提升。这实际上更复杂,因为块内的函数*声明实际上是无效的。然而浏览器允许它们实现不同的行为。请参阅[为什么函数声明在不同的浏览器中处理方式不同?](http://stackoverflow.com/q/8871974/218196) –

+0

如果您执行了'var a = true; const foo = a? ()=> console.log('a'):()=> console.log('b'); foo();'然后控制台会记录'a',因为'foo'不会被挂起。 – Josep

回答

0

这是因为函数声明被javascript解析器移动到文件的顶部。这就是他们提出的意思。 foo的最后一个声明会在第一次挂起时覆盖第一个声明。

+1

你的解释不正确。函数声明不允许在块内部,所以一些浏览器“挂起”它们,有些则没有(将它们当作函数声明,是对ECMA-262的扩展),有些则抛出错误。目前规范中的行为已经或多或少地标准化了,但是它们的使用是令人沮丧的。请参阅[*重复链接*](http://stackoverflow.com/questions/43135925/why-javascript-function-declaration-behave-differently-in-chrome-and-safari)。 – RobG

+0

@RobG - 这是不正确的。请参阅此页上有关功能托管的部分: http://adripofjavascript.com/blog/drips/variable-and-function-hoisting –

+0

特别是,在该页面上,您可以搜索'isItHoisted'并查看功能和解释。 –