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

  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number (考虑负数的情况)
    8. String to Integer (整数的溢出)
    7. Reverse Integer (整数的溢出)
    LeetCode Minimum Size Subarray Sum
    LeetCode Course Schedule II
    Linux 文件缓存 (一)
    LeetCode Tries Prefix Tree
    Linux : lsof 命令
    LeetCode Binary Tree Right Side View
  • 原文地址:https://www.cnblogs.com/daofaziran/p/13431606.html
Copyright © 2011-2022 走看看