js中变量提升(js函数提升和变量提升优先级)

图片授权基于 CC0 协议

变量提升涉及到的知识点很少,可以直接上代码。

var web = \\\'JavaScript\\\';

上面「声明变量 web 并赋值」其实是分两步执行:

    var web;//1、先声明变量;//执行其它代码web = \\\'JavaScript\\\';//2、在指定的作用域区赋值

    所以,就引出一个问题,如果先输出后定义变量会怎样?

    console.log(web);//undefinedvar web = \\\'JavaScript\\\';//执行赋值

    打印变量 web 会输出 undefined 而不是 is not defined ,它的执行逻辑是这样的:

    var web;//1、先提升变量console.log(web);//2、控制台输出:undefinedweb = \\\'JavaScript\\\';//3、变量赋值console.log(web);//4、控制台输出:JavaScript

    变量 web 会被提升到最上面;

    除了变量提升还有函数提升。

    一、函数表达式

    webFn();//控制台输出:webFn is not a function//函数表达式var webFn = function(){  console.log(\\\'JavaScript\\\')}

    函数表达式和变量提升同理。

    二、函数声明

    webFn();//控制台输出:JavaScript//函数声明function webFn(){   console.log(\\\'JavaScript\\\');}

    上面代码真实的执行逻辑是:

    function webFn(){  console.log(\\\'JavaScript\\\');}webFn();//JavaScript

    函数提升的时候会提升整个函数,提升到最顶部。

    那「函数名」和「函数表达式名」相同,如何处理?

      //函数声明function webFn(){  console.log(\\\'JavaScript1\\\');}//函数表达式var webFn = function(){  console.log(\\\'JavaScript2\\\');}webFn();//控制台输出:JavaScript2

      函数表达式会提前声明函数,但只有执行完后,才会赋值。但「函数声明」会提升到最顶部。

      简单总结

      1. 每个作用域都会进行提升操作。

      2. 声明本身会被提升,赋值或其他运行逻辑会留在其作用域。

      3. 函数先被提升,然后才是变量。

      4. 函数声明会被提升,函数表达式不会被提升。


      参考资料:

      [1]《你不知道的 JavaScript 上 》

      原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34572.html

      (0)
      小道研究's avatar小道研究
      上一篇 2024年4月8日 下午2:16
      下一篇 2024年4月8日 下午2:18

      相关推荐

      发表回复

      您的邮箱地址不会被公开。 必填项已用 * 标注