• 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
    ```
  • 相关阅读:
    HTML 基础学习笔记
    使用python访问网络上的数据
    linux上创建ftp服务器下载文件///使用AWS服务器作为代理,下载sbt相关的包
    jquery,字符串转json对象,json对象转字符串
    vue渲染过程的{{xxx}}显示的解决办法
    v-model select 选中值后自动改变vue实例中的属性值
    uniapp华为手机真机运行方法
    获取本机mac地址
    编码Code
    int型比较大小
  • 原文地址:https://www.cnblogs.com/kpengfang/p/9866266.html
Copyright © 2020-2023  润新知