javascript - 高程中一个函数声明例子的困惑
本文介绍了javascript - 高程中一个函数声明例子的困惑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
《JavaScript 高级程序设计》第七章函数,关于函数声明的提升问题,有这样一个例子:
if(condition){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
书上原文说:
表面上看,以上代码表示在condition 为true 时,使用一个sayHi()的定义;否则,就使用另一个定义。实际上,这在ECMAScript 中属于无效语法,JavaScript 引擎会尝试修正错误,将其转换为合理的状态。但问题是浏览器尝试修正错误的做法并不一致。大多数浏览器会返回第二个声明,忽略condition;Firefox 会在condition 为true 时返回第一个声明。因此这种使用方式很危险,不应该出现在你的代码中。
但是我在 chrome 和 js bin里面测试,把 condition 改成 true,都能 alertHi,并没有出现书上说的大多数浏览器会返回第二个声明,忽略condition的问题,这是为什么呢:
if(true){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
sayHi();// Hi!
求教,多谢!
解决方案
true是一个字面量,不是一个变量,浏览器在解析的时候会把你这个if语句直接优化掉,类似于这样:
if(true){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
变成
function sayHi(){
alert("Hi!");
}
然而作者指的是另一种情况
if(condition){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
var condition = true
sayHi()
这篇关于javascript - 高程中一个函数声明例子的困惑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文