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;

    }

  • 相关阅读:
    HTML5 GeoLocation 地理定位
    HTML5 LocalStorage 本地存储
    JS-事件代理(委托)
    面向对象(封装、继承、多态)
    js图片预加载
    jQuery 事件
    svn无法验证
    Ext.data.Store(转)
    ExtJS实现Excel导出(转)
    <![CDATA[ ]]> 意思
  • 原文地址:https://www.cnblogs.com/ljs0322/p/8999780.html
Copyright © 2011-2022 走看看