js基础知识 你不知道的变量提升的坑

以前一直认为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这两个浏览器,所以只做了这两个浏览器测试。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值