Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 条件语句中的JS提升不';我们不能给出预期的结果_Javascript_Hoisting - Fatal编程技术网

Javascript 条件语句中的JS提升不';我们不能给出预期的结果

Javascript 条件语句中的JS提升不';我们不能给出预期的结果,javascript,hoisting,Javascript,Hoisting,我正在读《你不知道JS》一书,我读了这部分: 作者在这里的意思是,这些foo函数将被提升到全局级别,因为条件语句没有能力在JS中创建自己的作用域。因此,预期的行为是,我将得到b打印 但是,结果是一个错误: “未捕获类型错误:foo不是函数 时间:1:1“ 但是,如果我这样做: var a = true; if (a) { function foo() { console.log( "a" ); } } else { function foo() { console.log( "b" )

我正在读《你不知道JS》一书,我读了这部分:

作者在这里的意思是,这些foo函数将被提升到全局级别,因为条件语句没有能力在JS中创建自己的作用域。因此,预期的行为是,我将得到b打印

但是,结果是一个错误: “未捕获类型错误:foo不是函数 时间:1:1“

但是,如果我这样做:

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

然后调用函数,我将得到结果“a”?

好吧,作者没有得到正确的结果(或者你没有?)。有一个叫做“有条件地创建函数”的特性,请参见MDN。该功能本身并没有得到广泛的支持,因为它是“正式”添加到ES6中的,尽管例如FireFox已经实现了多年。作者描述的行为已经过时了。(这是一天中出现两次与“你不知道JS”相关的过时行为。2009年描述的第一次相关行为,相当令人震惊,因为“你不知道JS”是在那之后写的。不过这在ES2015中发生了变化。)@Teemu这不是一个功能。ES6中关于兼容性模式的部分包括定义一致性行为。在严格模式下,这仍然是一个明显的错误。(有关详细信息,请参见第二个副本)@Bergi-在严格模式下,将函数声明用作语句不是错误。(上面的代码是,因为
foo
没有在使用它的地方声明,但是在条件块中声明函数不是。)@t.J.Crowder是的,我的意思是在其块范围之外使用函数是错误的。