Skip to content
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

执行环境与作用域 #4

Open
Abiel1024 opened this issue Mar 26, 2018 · 0 comments
Open

执行环境与作用域 #4

Abiel1024 opened this issue Mar 26, 2018 · 0 comments

Comments

@Abiel1024
Copy link
Owner

Abiel1024 commented Mar 26, 2018

执行环境(execution context)

作用:定义了变量或函数有权访问的其他数据。
变量对象:每个执行环境都有一个与之关联的变量对象(variable object),执行环境中定义的所有变量和函数都保存在这个对象中。(我们无法访问,在解析器处理数据时会使用。感觉有点像全局执行环境中的windows)。
每次当控制器转到可执行代码的时候,就会创建一个环境,当所有代码执行完毕后,改环境被销毁,保存在其中的所有变量和函数定义也随之销毁。

全局执行环境

在浏览器中,全局执行环境被认为是window对象。
所有全局变量和函数都是作为window对象的属性和方法创建的。不过从 ES6 开始,新增了let 和 const 全局变量将逐步与顶层对象的属性脱钩。

var a = 1
console.log(window.a) //1
function test() {
    console.log(2)
}
window.test() //2
let b = 2
console.log(window.b) //undefined

函数执行环境

当执行流进入一个函数是,函数的环境就会被推入一个环境栈中。
在函数执行之后,栈将其环境弹出。
具体可看这么一个例子:

var Bob = new Object();
function moreInfo() {
    Bob.name = "Bob"
    function setAge() {
        Bob.age = 28
    }
    setAge()
}
moreInfo()

流程示意图
image

作用域

当代码在一个环境中执行时,会创建变量对象的一个作用域链。
用途:保证对执行环境有权访问的所有变量和函数的有序访问。

可以看这么一个例子

var ball = 50
var water = 2
function school() {
    var ball = 60
    console.log(water) //2
    console.log(ball) //60

    function gym() {
        var water = 3
        console.log(water) //3
        console.log(ball) //60
    }

    gym()
}
school()
console.log(water) //2
console.log(ball) //50

这个例子共涉及三个执行环境:全局环境、school()的局部环境、gym()的局部环境。在不同的环境中,都访问了water和ball的值,如何保证这些值能有序的访问就是作用域链的效果了 。
image
作用域链是由一系列变量对象组成,这个通道时候从左往右单项传递的。每个环境都可以向上搜索作用域链,以查询变量和函数,但不能向下进入另一个执行环境。所以在school中能访问到当前作用域的ball和上一级全局中的water,而gym中,访问到了当前作用域的water,就不会继续往上寻找。寻找ball时,当前作用域中没有,会寻找school中,找到了ball就不会继续往上寻找。

@Abiel1024 Abiel1024 changed the title JavaScript作用域 执行环境与作用域 Mar 26, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant