JavaScript中的变量提升和函数提升

变量提升

首先看代码例子:

 	console.log(a);//输出 undefined
    var a = 1;

var关键字声明的变量会进行变量提升,所以是输出undefined。
那么其内部原理是什么样的呢?
首先可以理解为这样:

var a;
console.log(a);
a=1;

JavaScript会把 var a=1看为2步,var a和a=2,变量的声明是在代码编译阶段(也可以说是预处理阶段)进行的,然后变量的赋值是在代码执行阶段执行的。

函数提升

看代码例子:

	fn();//输出 哈哈
    function fn() {
        console.log("哈哈");
    }

在函数调用之前,JS会把fn这个函数体编译一遍,但是不是调用,所以可以理解为这样:

    function fn() {
        console.log("哈哈");
    }
    fn();//输出 哈哈

在这里插入图片描述
上图:在函数声明之前,打印window下的fn输出该函数体,所以在函数调用执行之前,函数已经进行了编译。

变量提升和函数提升哪一个优先呢?

看一个例子:

{
    var c = 1;
    function c(c) {
        console.log(c);
    }
    c(2);//报错 :c is not a function!
}

JS中函数提升会高于变量提升
上面代码执行顺序:
1.首先进行编译,首先对函数进行提升,这时候c是一个函数,然后再进行变量提升,然后这时候的c就从一个函数变成了一个变量。
2.编译完成再进行执行,然后就是给c赋值:c=1,所以c还是变量,当遇到c(2)的时候,因为c最后已经是变量了,所以这里就直接会报错说:c is not a function!。

上面的步骤用代码可以表示为:

{
    //编译阶段:
    function c(c) {
        console.log(c);
    }
    var c;
    //执行阶段:
    c = 1;
    c(2);//报错 :c is not a function!
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坦淡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值