zoukankan      html  css  js  c++  java
  • js不管条件是否成立都要进行变量提升

    ### 不管条件是否成立都要进行变量提升
    > 不管条件是否成立,判断体中出现的var/function都会进行变量提升;但是在最新浏览器版本当中,function声明的变量只能提前声明,不能定义了(前提:函数是在判断体重)。
    ```javascript
    // 不管条件是否成立都要进行变量提升
    console.log(num);//=>undefined
    console.log(fn);//=>undefined
    if (1 == 1) {
    var num = 12;
    function fn() {

    }
    }
    ```

    > 代码执行到条件判断地方
    > [条件不成立]
    > 进入不到判断体中,此时之前声明的变量或者函数依然是undefined

    > [条件成立]
    > 进入条件判断体中的第一件事情不是代码执行,而是把之前变量提升没有定义的函数首先定义了(进入到判断体中函数就定义了,迎合ES6中的块级作用域)。

    ```javascript
    // 不管条件是否成立都要进行变量提升
    console.log(num);//=>undefined
    console.log(fn);//=>undefined
    if (1 == 1) {
    console.log(num);//=>undefined
    console.log(fn);//=>函数本身---此处条件成立,先把变量提升没定义的函数首先定义了
    var num = 12;
    function fn() {

    }
    console.log(num);//=>12
    console.log(fn);//=>函数本身
    }
    ```

    > 老版本浏览器不是这样处理的:不管条件是否成立,都要进行变量提升(和新版本不一样的地方,新版本function只是声明,老版本function依然是声明+定义)

    ```javascript
    //=>var function 没有提升变量

    f = function () {
    return true;
    }
    g = function () {
    return false;
    }
    ~function () {
    //=>[私有作用域]
    //变量提升:g=undefined新浏览器不管条件是否成立,都进行变量提升,只对函数进行声明
    //![]false []==![]//=>true true&&true
    if (g() && [] == ![]) {//=> Uncaught TypeError: g is not a function
    f = function () {//
    return false;
    };
    function g() {
    return true;
    }
    }
    }();

    console.log(f());

    console.log(g());
    //新浏览器下 g is not a function
    //老浏览器下 false false 273行的f是全局的,把全局修改为了false,276的g是私有作用域,跟全局没有影响,所以还是false
    ```
  • 相关阅读:
    SQL SERVER数据库大型应用解决方案总结
    SQL Server 2005利用分区实现海量数据处理实例
    php验证码类
    软件开发项目进度控制浅谈
    栈和队列
    .Net多线程总结
    Silverlight 3 UI类结构
    C#全角半角转换函数
    转Silverlight Navigation(多页面切换、传值)
    Silverlight 学习笔记——应用程序模型
  • 原文地址:https://www.cnblogs.com/kpengfang/p/9866266.html
Copyright © 2011-2022 走看看