function bar() {
console.log(myName)
}
function foo() {
var myName = " 孙悟空 "
bar()
}
var myName = " 猪八戒 "
foo()
控制台输出结果为 猪八戒
- 每个执行上下文的变量环境中,都包含了一个外部引用,用来指向外部的执行上下文,我们把这个外部引用称为outer
- 代码在查找 myName 变量时,如果在当前的变量环境中没有查找到,那么 JavaScript 引擎会继续在 outer 所指向的执行上下文中查找
- bar 函数和 foo 函数的 outer 都是指向全局上下文的(函数声明的位置决定),这也就意味着如果在 bar 函数或者 foo 函数中使用了外部变量,那么 JavaScript 引擎会去全局执行上下文中查找。我们把这个查找的链条就称为作用域链
词法作用域
词法作用域就是指作用域是由代码中函数声明的位置来决定的,所以词法作用域是静态的作用域,通过它就能够预测代码在执行过程中如何查找标识符
- 词法作用域就是根据代码的位置来决定的
- 词法作用域是代码阶段就决定好的,和函数是怎么调用的没有关系
- 对象在js中不属于单独的局部作用域