2017-02-12 80 views
0

本地定义的函数我有这样的代码片段:范围在JavaScript

sayHi() 

if (1) { 
    function sayHi() { alert(1) } 
} else { 
    function sayHi() { alert(2) } // <-- 
} 

它是如何真正起作用?这些函数在if/else块中定义。那么它们如何在if/else块之外进行限定呢?

+1

他们不是。当我运行它时,我得到'TypeError:sayHi不是函数' – bejado

+0

这个问题似乎很不清楚......... –

回答

0

所有内容都在Javascript的功能级别范围内,而不是像大多数其他语言一样在块级别上。因此,如果您在for循环中定义var,它将被“悬挂”到包含函数的顶部。

+0

这不完全正确。 'var'和'function'声明是函数范围的,但'let','const'和'class'声明是块范围的。 – Frxstrem

1

该函数的作用域是整个包含函数,因为函数声明被挂起。但是,在执行ifelse块之前,函数没有为其定义分配给它。它相当于:

var sayHi; 
sayHi(); 

if (1) { 
    sayHi = function() { alert(1); }; 
} else { 
    sayHi = function() { alert(2); }; 
}