作用域
2021-08-20 本文已影响0人
小豆soybean
函数存在scope属性。
原文链接:https://www.cnblogs.com/zhimao/p/15061102.html
1. 作用域
作用域是指程序源代码中定义的范围
作用域规定了如何设置变量,也就是确定当前执行代码对变量的访问权限
JavaScript采用词法作用域,也就是静态作用域
1.1 词法作用域
所谓词法作用域, 是指函数的作用域在函数的定义时就已经确定了
示例
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar(); // 1
2. 作用域链
在js中, 函数存在一个隐式属性 [[scopes]]
, 这个属性用来保存当前函数的执行上下文环境, 由于在数据结构上是链式的, 因此也被称作是作用域链, 我们可以把它理解为一个数组
可以理解为是一系列的AO对象所组成的一个链式结构
函数存在[[scopes]]属性
function a() {}
console.dir(a) // 打印内结构
image
当函数被调用后
function a() {
console.dir(a);
}
// 调用函数
a()
image
因此我们可以得出一个结论: [[scopes]] 属性在函数声明时产生, 在函数调用时更新
即: 在函数被调用时, 将该函数的AO对象压入到[[scopes]]中
3. 作用域链的作用
作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的
最直观的表现就是:
- 内部函数可以使用外部函数声明的变量
示例
function a() {
var i = 100
function b() {
console.log(i);
}
b()
}
a() // 100
- 外部函数不可以使用内部函数声明的变量
示例
function a() {
var i = 100
function b() {
var i = 200
console.log(i);
}
b()
}
a() // 200
仅记录自己的学习总结,如有错误,还请评论指正~