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

    js的变量提升

    找到所有的var关键字,把var的执行,提升到作用域顶端,也就是var声明提前了,但是赋值还是在原地。例如:

    console.log(a);   //undefined
    var a=10;
    console.log(a);   //10
    

    执行过程变成了如下:

    var a;
    console.log(a);
     a=10;
    console.log(a);   //10
    
    let中不存在变量提升
    // var 的情况
    console.log(foo); // 输出undefined
    var foo = 2;
    // let 的情况
    console.log(bar); // 报错ReferenceError
    let bar = 2;
    
    声明会提升到作用域顶端
    a = 1;
    var a;
    console.log(a); //1
    

    当在函数作用域中操作一个变量的时候,会先在自身作用域中查找,如果有就直接使用,如果没有就向上级作用域中寻找。如果全局作用域中也没有,那么就报错。

    根据内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为函数作用域链

    作用域链的原则:就近原则

        console.log(v1);
            var v1 = 100;
            function foo() {
                console.log(v1);
                var v1 = 200;
                console.log(v1);
            }
            foo();
            console.log(v1);
    
    js中var的变量和function的函数名重名时的执行结果

    如果var的变量和function的函数名重名时,var的优先级更高,先执行var,按照var划分区域,但是遇到function,function会直接占用,也就是说最终执行function

       console.log(a);  //f a(){}
       var a=10;
       function a(){
       };
       console.log(a); //10
    

    执行过程如下:

       var a;
       function a(){
       };
       console.log(a);  //f a(){}
        a=10;
       console.log(a); //10
    
    声明式函数是整体提升
     	   fn(); //hello
            function fn() {
                console.log("hello");
            };
            fn(); //hello
    

    执行过程如下:

       function fn(){
           console.log("hello");
       };
    
       fn();
       fn();
    
    请用今天的努力,让明天没有遗憾。
  • 相关阅读:
    Logback日志格式配置相关记录
    前后端分离验证码之cookie+redis方案
    聊一聊Swagger ui登录功能实现方案
    nginx-thinkphp5
    jmeter常用的性能测试监听器
    jvm内存
    TCP连接状态详解
    原生Javascript实现图片轮播效果
    适用于CSS2的各种运动的javascript运动框架
    JS中for循环里面的闭包问题的原因及解决办法
  • 原文地址:https://www.cnblogs.com/cupid10/p/12793196.html
Copyright © 2011-2022 走看看