• 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;

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

  • 相关阅读:
    java基础面试
    GC 相关 ---垃圾回收机制
    JVM 内存管理--jvm内存的划分
    Java 中创建一个对象的过程?
    双亲委派模型(Parent Delegation Model)?
    4、ReactJs基础知识04--state&&生命周期
    3、ReactJs基础知识03--组件&&props
    2、ReactJs基础知识02--元素渲染
    1、ReactJs基础知识01--入门使用
    再次理解JSONP
  • 原文地址:https://www.cnblogs.com/ganmy/p/6846860.html
Copyright © 2020-2023  润新知