作者在之前的文章ScopeandExecutionContext中介绍了scope和executioncontext。它们是JavaScript中非常重要的知识点,是基础的重点,是Base的重点。我们说过,JavaScript中的作用域是词法作用域,与定义的位置有关;而executioncontext与invocation相关,两者虽然有联系,但又是不同的概念。知道它定义在哪里其中,函数的作用域是最重要的,因为作用域内的变量不能在作用域外访问,起到了保护变量的作用没有生命周期可以理解为“static”(lexicalscope)globalScope,functionscope,block-levelscope,andevalscopeExecutioncontext和executioncontext与调用有关。它代表了一段代码执行时携带的所有信息,包括this、词法环境、变量环境(ES5标准)。结合前面的this给定的定义:谁调用谁,this就指向谁与执行上下文相关。与调用者密切相关的执行上下文也是如此。生命周期分为两个阶段。创建阶段决定this,也就是众所周知的this绑定创建变量。环境记录器注册声明的变量,例如var和function。这时候会发生变量提升和函数提升对外部环境(outer)的引用指向父作用域(作用域在代码执行之前就已经确定)创建词法环境环境记录器并注册let声明的变量,const等变量会被提升,但不会被Initialization,所以提前使用会报ReferenceError。如示例1所示,对外部环境(outer)的引用也指向父作用域。执行阶段指向代码以确定作用域链。它是“动态的”(与调用者相关)和全局执行上下文、函数执行上下文、模块执行上下文、eval执行上下文示例1:a//undefinedb//ReferenceErrorc//ReferenceErrord//functiond(){}vara=1;令b=2;constc=3;functiond(){}var声明变量会被初始化为undefined,一般函数(函数声明式写法)定义会被初始化为functionxx(){},let和const不会被初始化,所以var定义的变量可以是提前使用但指未定义。一般提前定义好函数就可以正常使用了。如果提前使用let和const,会报错PS。如果在函数表达式的写法中使用函数,则其后跟变量,如vare=function(){}或letf=()=>{}以上是scope和context的各种区别。深入理解JavaScript——对象(object)深入理解JavaScript——whatdidnew深入理解JavaScript——Object。——JavaScript第一帝深入理解JavaScript——instanceof——找祖宗看懂JavaScript——Function深入理解JavaScript——Scope深入理解JavaScript——this关键字深入理解JavaScript——调用、应用、绑定理解JavaScript——词法环境深入理解JavaScript——深入理解JavaScript—ScopeVSExecutionContext深入理解JavaScript—Closure深入理解JavaScript—防抖与节流深入理解JavaScript—函数式编程深入理解JavaScript—垃圾回收机制—深入理解JavaScript——数组深入理解JavaScript——loopscomehere深入理解JavaScript——字符串
