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

    标识符提升

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

    在js中只有两种作用域,全局作用域和函数作用域,在ES6之前,js是没有块级作用域。

    #JavaScript 代码的执行分为两个阶段。
    第一个阶段在当前词法环境中注册所有的变量和函数声明,简单说就是,解析,解析完成之后,第二个阶段的 JavaScript 执行就开始了!
    
    #JS中创建函数有两种方式:
    函数声明式和函数字面量式。只有函数声明才存在函数提升。

    JavaScript 仅提升声明,而不提升初始化。如果你先使用的变量,再声明并初始化它,变量的值将是 undefined。

    1:所有的声明都会提升到作用域的最顶上去。
    
    2:同一个变量只会声明一次,其他的会被忽略掉。
    
    3:函数声明的优先级高于变量申明的优先级,并且函数声明和函数定义的部分一起被提升。
    
    变量提升的例子:
    
    num = 6;
    var num = 7;
    var num;
    console.log(num); // 不报错,输出7,也证明了变量只会声明一次,其他的会被忽略。
    
    函数提升的例子:
    
    catName("Chloe");// 即使在声明之前调用依然可以执行,不会报错
    
    function catName(name) {
        console.log("我的猫名叫 " + name);
    }
    
    在定义的函数名字和变量名相同的情况下,函数提升优先级高于变量的例子:
    
    func(); // 1
    var func;
    function func() {
      console.log(1);
    }
    func = function() {
      console.log(2);
    }
    
    输出1,不会输出2。函数声明和变量声明都会被提升,但是需要注意的是函数会先被提升,然后才是变量。
    
    var func;尽管出现在function func()之前,但它是重复的声明,会被忽略,因为函数声明会被提升到普通变量之前。
    
    等同于这样:
    
    function func() {
      console.log(1);
    }
    func(); // 1
    func = function() {
      console.log(2);
    }
    
    牢记这三点:
    
    只有声明本身会被提升,而赋值操作不会被提升。
    
    变量会提升到其所在函数的最上面,而不是整个程序的最上面。
    
    函数声明会被提升,但函数表达式不会被提升。

    转载于:https://blog.csdn.net/qq_33505829/article/details/86158287

  • 相关阅读:
    Cocos Creator Editor 第一个编辑器扩展(扩展菜单)
    Rider 设置
    unity 使用GameObject.SetActive(true)激活对象时,会在SetActive内部调用Awake和OnEnable函数
    unity/C# 结构体属性使用set和get访问器应注意的问题
    unity 自定义AssetImporter导入指定资源
    Duilib部分源码解析
    TreeView树形控件的使用
    JQuery 文档资源收集
    排序和搜索(一)插入排序系列
    字符相关类型和编码概念
  • 原文地址:https://www.cnblogs.com/daofaziran/p/13431606.html
Copyright © 2011-2022 走看看