"JavaScript Advanced Programming" Kapitel 7 Funktionen, bezüglich der Förderung von Funktionsdeklarationen gibt es ein solches Beispiel:
if(condition){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
Der Originaltext im Buch lautet:
Oberflächlich betrachtet bedeutet der obige Code, dass, wenn die Bedingung wahr ist, eine Definition von sayHi() verwendet wird, andernfalls eine andere Definition. Tatsächlich handelt es sich hierbei um eine ungültige Syntax in ECMAScript, und die JavaScript-Engine wird versuchen, den Fehler zu korrigieren und ihn in einen vernünftigen Zustand umzuwandeln. Das Problem besteht jedoch darin, dass Browser in ihren Versuchen, Fehler zu korrigieren, inkonsistent sind. Die meisten Browser geben die zweite Anweisung zurück und ignorieren die Bedingung; Firefox gibt die erste Anweisung zurück, wenn die Bedingung wahr ist. Daher ist diese Verwendung gefährlich und sollte nicht in Ihrem Code verwendet werden.
Aber ich habe es in Chrome und js bin getestet und die Bedingung auf „True“ geändert, und es kann „Hallo“ anzeigen. Es gibt kein Problem wie „Die meisten Browser geben die zweite Anweisung zurück und ignorieren die Bedingung“, die im Buch „This Why“ erwähnt wird :
if(true){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
sayHi();// Hi!
Bitte um Rat, danke!
true是一个字面量,不是一个变量,浏览器在解析的时候会把你这个if语句直接优化掉,类似于这样:
然而作者指的是另一种情况
编译器拿到这段代码以后,发现有两个处于同一个作用域中的重复函数声明,第一个声明会直接被第二个声明替换掉。
js确实是不推荐在块内部声明函数的。
在严格模式下,这段代码直接报错。