-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
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
作用域和执行上下文栈 #9
Comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
mqyqingfeng/Blog#3
mqyqingfeng/Blog#4
作用域
思考,下面的代码会打印什么结果?
作用域分为两类:词法作用域、动态作用域。
词法作用域中函数的作用域在函数定义的时候决定(函数中遇到既不是形参也不是函数内部定义的局部变量的变量时,去函数定义时的环境中查询)。
动态作用域中函数的作用域在函数调用的时候决定(函数中遇到既不是形参也不是函数内部定义的局部变量的变量时,去函数调用时的环境中查询)。
JavaScript 采用的是词法作用域,我们可以分析上面代码的执行过程:执行
foo
,没有查找到局部变量value
,根据其定义的环境查找上层代码,找到value
的声明,所以输出结果为 1。执行上下文栈
JavaScript 创建了“执行上下文栈”来管理函数执行时的上下文。在代码中,每遇到一次函数执行就会创建一个对应的执行上下文栈。
思考,运行上面代码的过程中执行上下文栈会发生什么样的变化?
我们用一个
Stack
模拟执行上下文栈。JavaScript 在执行代码前,会最先遇到全局代码。所以在执行
fun1()
前就会向栈中压入一个全局上下文栈。当执行一个函数时就会创建一个执行上下文并入栈;当函数执行完毕时,就会将函数的执行上下文从栈中弹出。所以执行上下文栈的变化如下:
思考
结合上面的内容,看看下面的两段代码有什么区别。
首先看返回结果,根据词法作用域的规则,两个
function f
定义的位置所找到的一定都是局部变量scope
,所以返回值为"local scope"
。再看执行上下文栈
第一段代码:
第二段代码:
The text was updated successfully, but these errors were encountered: