We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
作用域是指程序源代码中定义变量的区域。
作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。
JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。
词法作用域,函数的作用域在函数定义的时候就决定了。
var value = 1; function foo() { console.log(value); } function bar() { var value = 2; foo(); } bar();//1
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f; } checkscope()();//global scope
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f(); } checkscope();//local scope
execution context,执行环境/执行上下文。 在javascript中,执行上下文可以抽象的理解为一个object(绝对不是变量对象!变量对象是执行上下文的一部分),每个执行上下文抽象为一个对象并有三个属性:
executionContext:{ variable object:vars,functions,arguments, scope chain: variable object + all parents scopes thisValue: context object } }
变量对象 每一个执行上下文都会分配一个变量对象(variable object),变量对象的属性由变量(variable) 和 函数声明(function declaration) 构成。在函数上下文中,参数列表(parameter list)也会被加入到变量对象中作为属性。(在全局上下文中,是没有参数列表的) 全局上下文中的变量对象就是全局对象,在浏览器中就是window(可以直接访问) 变量对象与当前作用域息息相关。 不同作用域的变量对象互不相同,它保存了当前作用域的所有函数和变量。
活动对象 函数上下文中,活动对象就等于变量对象,不能直接访问。(在一些平台中,实现了_parent_来直接访问函数的变量对象) 活动对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。 函数被调用时,在函数的执行上下文会创建一个活动对象AO,并且被初始化为 AO = [arguments]。随后AO又被当做变量对象(variable object)添加函数声明和变量声明,此时 VO = [arguments].concat([name,age,gender,b])。
_parent_
AO = [arguments]
VO = [arguments].concat([name,age,gender,b])
Scope = AO + [[Scope]]
[[scope]]是所有父变量对象的层级链,处于当前函数上下文之上,在函数创建时存于其中。
function test(num){ var a = "2"; return a+num; } test(1);
复制函数的[[Scope]]变量构建作用域链——>创建活动对象——>活动对象被压入checkscope作用域链前端
每次调用函数,都会创建并激活新的上下文。
处理执行上下文,分为两个阶段 1.进入(创建)上下文【当函数被调用,但未执行任何其内部代码之前】:
注:这2个阶段的处理是一般行为,和上下文的类型无关(也就是说,在全局上下文和函数上下文中的表现是一样的)。
执行代码之前,先进入(创建)上下文。
在当前上下文上运行/解释函数代码,在这个过程中不断修改变量对象中的属性值。
函数执行上下文被压入执行上下文栈
创建函数上下文:
复制函数[[scope]]属性创建作用域链
用 arguments 创建活动对象,随后初始化活动对象,加入形参、函数声明、变量声明
将活动对象压入作用域链顶端
求出上下文内部“this”的值
同一个东西
1.认识javascript中的作用域和上下文 2.一道js面试题引发的思考 · Issue #18 · kuitos/kuitos.github.io 3.JavaScript深入之词法作用域和动态作用域 · Issue #3 · mqyqingfeng/Blog 4.JavaScript深入之执行上下文栈 · Issue #4 · mqyqingfeng/Blog 5.深入理解JavaScript系列(12):变量对象(Variable Object) - 汤姆大叔 - 博客园
The text was updated successfully, but these errors were encountered:
No branches or pull requests
作用域Scope
作用域是指程序源代码中定义变量的区域。
作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。
JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。
词法作用域,函数的作用域在函数定义的时候就决定了。
执行上下文 Execution Context
execution context,执行环境/执行上下文。
在javascript中,执行上下文可以抽象的理解为一个object(绝对不是变量对象!变量对象是执行上下文的一部分),每个执行上下文抽象为一个对象并有三个属性:
活动对象与变量对象
变量对象
每一个执行上下文都会分配一个变量对象(variable object),变量对象的属性由变量(variable) 和 函数声明(function declaration) 构成。在函数上下文中,参数列表(parameter list)也会被加入到变量对象中作为属性。(在全局上下文中,是没有参数列表的)
全局上下文中的变量对象就是全局对象,在浏览器中就是window(可以直接访问)
变量对象与当前作用域息息相关。
不同作用域的变量对象互不相同,它保存了当前作用域的所有函数和变量。
活动对象
函数上下文中,活动对象就等于变量对象,不能直接访问。(在一些平台中,实现了
_parent_
来直接访问函数的变量对象)活动对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。
函数被调用时,在函数的执行上下文会创建一个活动对象AO,并且被初始化为
AO = [arguments]
。随后AO又被当做变量对象(variable object)添加函数声明和变量声明,此时VO = [arguments].concat([name,age,gender,b])
。作用域链
Scope = AO + [[Scope]]
[[scope]]是所有父变量对象的层级链,处于当前函数上下文之上,在函数创建时存于其中。
至此test的作用域链构建完成。
复制函数的[[Scope]]变量构建作用域链——>创建活动对象——>活动对象被压入checkscope作用域链前端
处理执行上下文的过程
每次调用函数,都会创建并激活新的上下文。
处理执行上下文,分为两个阶段
1.进入(创建)上下文【当函数被调用,但未执行任何其内部代码之前】:
注:这2个阶段的处理是一般行为,和上下文的类型无关(也就是说,在全局上下文和函数上下文中的表现是一样的)。
进入(创建)上下文
执行代码之前,先进入(创建)上下文。
由名称和对应值组成的一个变量对象的属性被创建;没有传递对应参数的话,那么由名称和undefined值组成的一种变量对象的属性也将被创建。
为发现的每一个函数,在变量对象上创建一个属性,指向函数的指针(就是函数名)。
如果变量对象已经存在相同名称的属性,则完全替换这个属性。
为发现的每个变量声明,在变量对象上创建一个属性,并且将属性的值初始化为undefined。
如果变量的名字和已经声明的形式参数或函数相同,将不会进行任何操作。
代码执行
在当前上下文上运行/解释函数代码,在这个过程中不断修改变量对象中的属性值。
执行上下文栈
执行上下文栈工作流程
函数执行上下文被压入执行上下文栈
创建函数上下文:
复制函数[[scope]]属性创建作用域链
用 arguments 创建活动对象,随后初始化活动对象,加入形参、函数声明、变量声明
将活动对象压入作用域链顶端
求出上下文内部“this”的值
其他
执行上下文栈和作用域链的区别
执行上下文栈和调用栈call stack的区别
同一个东西
作用域和变量对象的区别
作用域和执行上下文的区别
参考资料
1.认识javascript中的作用域和上下文
2.一道js面试题引发的思考 · Issue #18 · kuitos/kuitos.github.io
3.JavaScript深入之词法作用域和动态作用域 · Issue #3 · mqyqingfeng/Blog
4.JavaScript深入之执行上下文栈 · Issue #4 · mqyqingfeng/Blog
5.深入理解JavaScript系列(12):变量对象(Variable Object) - 汤姆大叔 - 博客园
The text was updated successfully, but these errors were encountered: