本文深入解析JavaScript的执行环境、变量对象及作用域链机制。详细阐述全局与函数执行环境的区别,解释活动对象与arguments的关系,并通过代码示例演示var声明对作用域的影响及标识符查询规则,帮助开发者掌握变量访问权限与闭包基础。
执行环境与变量对象基础
执行环境
执行环境规定了变量或函数可以访问的其他函数范围,从而决定了它们各自的行为表现。每个执行环境都关联着一个特定的变量对象。
变量对象
该对象中保存了环境中定义的所有变量和函数。
全局与函数执行环境
全局执行环境
全局执行环境处于最外层。在Web浏览器环境中,全局执行环境对应Window对象,因此所有全局变量和函数均作为Window对象的属性和方法被创建。
每个函数都拥有自己独立的执行环境。
作用域链机制与特点
作用域链
当代码在特定环境中执行时,会构建出一个变量对象的作用域链。
其主要用途是确保对执行环境中所有有权访问的变量和函数进行有序访问。
作用域链的前端始终是当前执行代码所在环境的变量对象。若该环境为函数,则使用其活动对象作为变量对象,活动对象初始仅包含arguments对象。作用域链的下一个变量对象来自包含环境,再下一个则来自更外层的包含环境。
var color ="blue";
function changeColor() {
var anotherColor ="red";
function swapColors() {
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColors();
}
changeColor();
如图所示,内部环境可以通过作用域链访问外部环境,但外部环境无法访问内部环境中的变量和函数。每个环境均可沿作用域链向上搜索以查询变量和函数,但不能向下搜索。

变量声明与标识符查询规则
没有块级作用域 声明变量
使用var声明的变量会自动添加到最接近的执行环境中。如果省略var关键字,变量将被添加到全局环境中。
function add(num1,num2) {
var sum = num1+num2;
return sum;
}
var result= add(10,10)
console.log(sum)

sum is not defined
function add(num1,num2) {
sum = num1+num2;
return sum;
}
var result= add(10,10)
console.log(sum)

查询标识符
标识符搜索过程从作用域链的前端开始,向上逐级查找与给定名称匹配的标识符,一旦找到即停止搜索。这意味着如果局部环境中存在同名标识符,父环境中的同名标识符将被忽略。
var color ="red";
function getColor() {
return color;
}
console.log(getColor())

var color ="red";
function getColor() {
var color="green";
return color;
}
console.log(getColor())

参考:《javascript高级程序设计(第三版)》
以上这篇javascript基础进阶_深入剖析执行环境及作用域链就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。