以前一直认为if语句中的变量是不会发生变量提升的,尤其是if条件中判断语句为false的情况下,今天发生的事情却让我蒙了
<script type="text/javascript">
var a = 2;
console.log(fun)
if(a > 3){
function fun(){console.log('22')}
}
</script>
复制代码
在chrome控制台中打印undefined,而在safrai中打印的却是fun这个函数体, 在chrome只是将fun这个函数名提升到了外面,相当于var fun;而在safari中却是将整个函数提升到了外面(在ie8中测试也是) 所以我们在后面执行这个fun():
var a = 2;
console.log(fun)
if(a > 3){
function fun(){console.log('22')}
}
fun()
复制代码
根据上面的分析结果,在chrome中会报错提示这个fun is not a function,在safrai中则会执行fun,打印22。 但是并不是无限制的提升(只要定义在if语句内容的所有变量和函数都会提升)
var a = 2;
console.log(fun);
console.log(inner)
if(a > 3){
function fun(){
console.log('22')
var inner = 100
}
}
fun()
复制代码
这时打开浏览器查看,chrome和safari统一了,都会报错,提示找不到inner这个变量。所以if语句中发生变量提升也不是毫无底线的,只会发生在第一层。
最后来练习一下下面这道题目:
function test(){alert(22)};
(function(){
if(false){
function test(){alert(11)}
}
test();
})();
复制代码
根据之前的总结在chrome中会提升一个变量会test,所以后面执行这个test()会报错(因为立即执行函数这个作用域中有test,所以他就不会在往上找全局的test),因为test不是一个方法,而在IE8、safari中则会打印11(不管if有没有执行都是将这个test方法提升到外面)
坑真多呀…………:-(
(由于电脑上只安装了chrome和safari这两个浏览器,所以只做了这两个浏览器测试。)