zoukankan      html  css  js  c++  java
  • JavaScript作用域(第七天)

    我们都知道js代码是由自上而下的执行,但我们来看看下面的代码;

    test();

    function test(){

      console.log("hello world");

    };

    如果我们简单的认为js是由自上而下的执行,那么上面的代码应该会报错,提示test 不是一个方法;但结果并没有报错,而是进行正确的输出了;

    这样我们就应该知道js执行分为两部分

    1.预解析;2.执行

    预解析会将var 定义的变量及function进行提前处理;

    也就是说上面的代码会被处理为

    function test(){

      console.log("hello world");

    }

    test();

    所以调用并没有报错;

    下面我们再来测试var

    alert(a);

    var a=1;

    这时候弹出的是undefined;注意,并没有报错;

    而上面的代码其实是被预解析为

    var a;

    alert(a);

    a=1;

    所以弹出的是一个undefined;

    当变量与函数同名的时候,会忽略变量的提升,下面我们看一个例子

    console.log(test);

    function test(){

    }

    console.log(test);

    var test=123;

    console.log(test);

    上面的代码会被预处理为

    function test(){

    }

    console.log(test);

    console.log(test);

    test=123;

    console.log(test);

    我们可以看出变量名提升被忽略了;

    函数表达式不会被提升的,如

    test();

    var test=function(){

    };

    这时候运行,就会报错;提示test不是一个方法;

    预处理的代码为

    var test;

    test();

    test=function(){

    };

    js中没有块级作用域;

    例如

    if(true){

      var a=123;

    }

    如果是其他语言,如java,c#变量a只在if块级作用域有效;

    但在js中并没有这样的块级作用域;会被预处理为

    var a;

    if(true){

      a=123;

    }

  • 相关阅读:
    6-Python爬虫-分布式爬虫/Redis
    ES 查询时 排序报错(fielddata is disabled on text fileds by default ... )解决方法
    Intellij Idea webstorm 激活
    Intellij Idea 配置jdk
    java 获取(格式化)日期格式
    js 跳转 XSS漏洞 预防
    CSS去掉背景颜色
    js对象无法当成参数传递 解决方法
    Elasticsearch java api
    java多条件查询SQL语句拼接的小技巧
  • 原文地址:https://www.cnblogs.com/ljs0322/p/8999780.html
Copyright © 2011-2022 走看看