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

    预解析的过程
    代码的执行过程 程序在执行过程,会先将代码读取到内存中检查,会将所有的声明在此时进行标记。所谓的标记就是让js解释器直到有这个名字,后面在使用名字的时候,不会出现未定义的错误,这个标记就是提升 声明:
    名字的声明,标识符的声明(变量名的提升)
    名字的声明就是让我的解释器知道有这个名字
    名字没有任何数据与之对应
    函数的声明
    函数声明包含两部分
    首先告诉解释器函数的名字
    告诉解释器 这个名字对应的函数体是什么
    函数声明与函数表达式有区别,函数声明是单独写在一个结构中,不存在任何语句,逻辑判断等结构中 ``` 函数声明: function(){} function f(){}

     函数表达式:
        var f=function(){};
        this.sayHello=function(){};
        if(true){
            function f(){}
        }
    代码分析:
    
    案例1:
        var num=1;
        function num(){
            alert(num);
        }
        num();
    预解析过程
    提升声明 变量num
    再提升函数 num在内存中已经存在,因此直接绑定对应的函数体
    内存中有一个函数num
    执行代码
    给num赋值为1,覆盖函数
    调用num 由于num中存储的是数字1 因此报错
    案例2:
        var num=123;
        function foo1(){
            console.log(num);
            var num=456;
            console.log(num);
        }
        foo1();
    代码分析:
    
    预解析过程
    提升变量名num和函数foo1
    执行代码
    给num赋值为123
    调用函数
    进入函数的瞬间预解析,提升变量名num
    在函数内部是一个独立的空间,允许使用外部的变量即num覆盖外面的num
    执行第一句 输出为Undefined
    执行第二句 给num赋值为456
    执行第三句 输出为456
    案例3:
        if(true){
            function f1(){
                console.log('true');
            }
        }else{
            function f1(){
               console.log('false');
            }
        }
        f1();
    代码分析:
    
    预解析过程
    函数在判断语句中为表达式所以不提升
    执行代码
    执行if语句,条件成立,输出true
    但是一些老版本在执行过程中,会把If语句中的函数表达式当成函数声明来解析, 并提升函数输出为false*
  • 相关阅读:
    hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)
    hdu 1181 以b开头m结尾的咒语 (DFS)
    hdu 1258 从n个数中找和为t的组合 (DFS)
    hdu 4707 仓鼠 记录深度 (BFS)
    LightOJ 1140 How Many Zeroes? (数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3652 B-number (数位DP)
    HDU 5900 QSC and Master (区间DP)
    HDU 5901 Count primes (模板题)
    CodeForces 712C Memory and De-Evolution (贪心+暴力)
  • 原文地址:https://www.cnblogs.com/libin-1/p/5745726.html
Copyright © 2011-2022 走看看