Heim > Fragen und Antworten > Hauptteil
Javascript-Funktionsdeklarationsförderung, wird der Funktionskörper gemeinsam gefördert?
Wenn nicht ist, gibt es das folgende Gegenbeispiel:
console.log(demo.toString()); //‘function demo() {console.log('ok')}’
demo(); //‘ok’
function demo() {
console.log('ok')
}
Wenn ist, gibt es das folgende Gegenbeispiel:
console.log(func) // undefined ,如果直接执行func()函数抛出TypeError异常
if(true){
function func() {
console.log('11');
};
}else{
function func() {
console.log('22');
};
}
func(); // 11
Das erste Beispiel zeigt, dass auch der Funktionskörper hochgestuft wird. Wenn Sie den zweiten Teil des Codes gemäß dieser Idee verstehen, überdecken sich die „Umbenennungs“-Funktionen gegenseitig und die späteren überdecken die vorherigen, also die Konsole. log(func) Die Zeichenfolge „function func() {console.log('22');};“ wird ausgegeben, aber das ist eigentlich nicht der Fall.
Drei Fragen stellen sich:
Wie verstehen Sie „variable Förderung, Funktionspriorität“?
Ist auch die Funktion des Körpers verbessert?
Wie sind die Ergebnisse des zweiten Codeteils zu interpretieren?
習慣沉默2017-05-19 10:45:15
if代表着条件判断,编译的时候应该是不会去执行代码,只会检查语法词法分析。你可以尝试换浏览器,或者启用严格模式做一下测试,有可能会有意想不到的事情发生哦~
1.变量提升,函数优先,就是 var a = 1;function fun(){};中var a;和function fun(){}会提升上去,提升到作用域的顶层。
2.同样提升了。函数表达式不会,因为他是 var fun = function(){};这种,只会提升var fun;
3.第二段,其实可以用下面的方法解释
var func;
console.log(func)
if(true){
func=function func() {
console.log('11');
};
}else{
func=function func() {
console.log('22');
};
}
func(); // 11
某草草2017-05-19 10:45:15
在非严格模式下,放在if语句内部的函数声明是否会提升在各个内核的实现都不同。
结论是,函数会提升,但是在if语句内部时要看各个内核的实现。
严格模式禁止了不在脚本或者函数层面上的函数声明
PHP中文网2017-05-19 10:45:15
函数和变量声明会被提升,函数提升优先于变量提升,要直接运行的代码不能被提升吧。第一个代码里直接都提升了。第二个代码你定义的函数是在if 语句结构里面,两个log 和if 在运行栈里面应该是按顺序执行,显然if 语句运行之前你的func是还没有声明的 。
怪我咯2017-05-19 10:45:15
es6 有一些块级作用域的规则,这个地方 如果你你用老版本的 node或者低版本的chrome 运行
相当于以下代码
function func() {
console.log('22');
};
console.log(func);
if(true){
}else{
}
func(); // 22
可是 高版本的 node和chrome限制了 这样的变量的提升,就出现了 你代码的情况!~!~
仅有的幸福2017-05-19 10:45:15
因为JavaScript是一种函数级作用域(function-level scope
)
所以if中并没有独立维护一个scope
英文解释:
javascript-variable-scope-and-hoisting-explained
中文解释:Javascript作用域和变量提升
PHP中文网2017-05-19 10:45:15
一般不建议在条件判断语句中书写函数声明。
这在ECMAScript中属于无效语法,javascript引擎会尝试修正错误,将其转换为正常合理的状态。然后这种修正的做法在不同的浏览器是不一样的。建议用函数表达式:
var func;
if(true){
func=function {
console.log('11');
};
}else{
func=function {
console.log('22');
};
}