zoukankan      html  css  js  c++  java
  • js作用域相关笔记

    1.js引擎、编译器、作用域。

    引擎:负责JS全过程的编译和执行;

    编译器:负责语法分析和代码生成;

    作用域:负责收集并维护声明组成的查询,以及当前执行代码对这些变量的访问权限(简言之,作用域就是用于编译和执行的一套规则)。

    三者的关系:编辑器要编译的时候会询问作用域,引擎要执行代码的时候也会询问作用域。

    2.LHS和RHS查询都是从当前执行作用域开始,若没找到所需标识符,以此向上级作用域查找,直到顶层作用域,若仍未找到,会抛出ReferenceError异常(TypeError这个异常,是操作非法引起的)。

    3.严格模式("use strict")不允许自动或隐式创建全局变量。

    即:用了严格模式,如果没有定义某个变量会抛出ReffrenceError的异常,但如果非严格模式,则不会报错,因为编译器会给它隐式创建一个全局变量。

    4.函数表达是可以避免定义变量名为undefined时引发的异常,同时可以避免污染全局作用域。(函数表达式可粗略理解为:作为参数的函数)

    (function foo(){

        console.log("haha");

    })();//最后这个括号表示立即执行表达式。

    ////////函数表达式传参/////////

    var a = 2;

    (function foo(global){

      console.log(global.a);//2

    })(window)

    5.编译过程中,函数和变量可以提升,且函数提升优先变量提升(如果命名相同的话),所以代码执行顺序不一定是我们写代码的顺序;

    例1:

    a = 2;

    var a;

    console.log( a );//2

    ////////////////////////

    例2:

    console.log( a );//引发ReffrenceError

    var a = 2;

    原因:编译器编译时分两步走,第一步定义声明,第二步赋值声明(这步会滞留,直到进行到执行阶段)

    所以上述代码执行顺序:

    例1:

    var a;

    a = 2;

    console.log(2);

    例2:

    var a;

    console.log(a);//定义了,但未赋值,故输出undefined.

    a = 2;

    所谓提升,就是在编译的时候把写在后面的代码优先声明了。比如可以在声明的某个函数/变量之前就调用它而不报错,下面这个代码自己敲敲、体会体会

  • 相关阅读:
    SilverLight之路(四)
    SilverLight之路(十一)
    SilverLight之路(五)
    SilverLight之路(九)
    SilverLight之路(八)
    设计silverlight的MediaPlay控件silverlight(银光)学习(3)
    自学MVC(三):郁闷的表单验证2009年05月04日
    silverlight的Button控件补完设计silverlight(银光)学习(2)
    拖动MediaPlay控件的滚动条来控制媒体播放silverlight(银光)学习(4)
    自学MVC(四):注册页面的完成2009年05月06日
  • 原文地址:https://www.cnblogs.com/ganmy/p/6846860.html
Copyright © 2011-2022 走看看