zoukankan      html  css  js  c++  java
  • js中的变量提升

    一、前言

    只能说,js所谓的变量提升,是设计缺陷,让很多新老手迷惑。好在ES6出了let和const,杜绝了大部分的变量提升问题,下面引述一位博友的话,他说的 “标识符提升”确实更为妥当。

    首先纠正下,文章标题里的 “变量提升” 名词是随大流叫法,“变量提升” 改为 “标识符提升” 更准确。因为变量一般指使用 var 声明的标识符,JS 里使用 function 声明的标识符也存在提升(Hoisting)。JS 存在变量提升,这个的设计其实是低劣的,或者是语言实现时的一个副作用。它允许变量不声明就可以访问,或声明在后使用在前。新手对于此则很迷惑,甚至许多使用JS多年老手也比较迷惑。但在 ES6 加入 let/const 后,变量Hoisting 就不存在了。

    以下是MDN对var的阐述

    变量声明,无论发生在何处,都在执行任何代码之前进行处理。用 var 声明的变量的作用域是它当前的执行上下文,它可以是嵌套的函数,或者对于声明在任何函数外的变量来说是全局。如果你重新声明一个 JavaScript 变量,它将不会丢失其值。

    二、简述

    变量提升优先级:函数声明>var形式的函数声明=var声明

    2.1 var声明

    var声明提升:

    function test(){
             console.log(a);
             var a=22;
         }
    
         test();  //输出undefined
    

    上述代码等同于:

         function test(){
             var a; //只是先被声明而已
             console.log(a);
             a=22; //负值
         }
    
        test();  //输出undefined
    

    2.2函数声明

         function test(){
             console.log(a());
             function a(){
                 return 2;
             }
         }
         test();                // 控制台输出:2
    

    等同于:

    function test(){
            function a(){       //刚才声明的函数会被提升
                 return 2;
             }
             console.log(a()); 
         }
         test();                // 控制台输出:2
    
  • 相关阅读:
    数组-11. 猴子选大王
    *数组-10. 求整数序列中出现次数最多的数
    数组-07. 求一批整数中出现最多的个位数字
    *数组-05. 字符串字母大小写转换
    数组-04. 查找整数
    《结对-网页贪吃蛇-最终程序》
    Forward团队-爬虫豆瓣top250项目-项目进度
    《结对-HTML贪吃蛇游戏项目-测试过程》
    课后作业-阅读任务-阅读提问-2
    《20171005-构建之法:现代软件工程-阅读笔记》
  • 原文地址:https://www.cnblogs.com/panshaojun/p/14690964.html
Copyright © 2011-2022 走看看