您的位置:首页 > Web前端 > JavaScript

JavaScript执行环境及作用域

2017-03-12 15:41 190 查看
(还是看代码比较直观...)
执行环境(环境): 定义了变量或函数有权访问的其他数据,决定了它们各自的行为.

变量对象: 每个环境中都有一个变量对象,环境中定义的所有函数和变量都保存在这个对象中.

window是最外围的全局环境.

执行流: 当执行流进入一个函数时, 函数的环境就被推入环境栈中,函数执行完后又被栈弹出, 将控制权返回给之前的执行环境.

作用域链: 当代码在一个环境中执行时,会创建变量对象的一个作用域链. 当前代码的执行环境就是作用域链的前端. 如果是函数则将其活动对象作为变量对象, 开始时只有一个arguments变量(这个变量在全局环境中是不存在的).作用域链中的下一个变量对象来自包含(外部)环境,一直延续到全局环境中.

例1

var color = "blue";

function changeColor () {
if (color === "blue") {
color = "red";
} else {
color = "blue"; }
}

changeColor();
alert("Color is now " + color);//red


例2

在局部作用域中定义的变量可以在局部环境中与全局变量互换使用,如:
var color = "blue";

function changeColor() {
var anotherColor = "red";

function swapColors() {
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;

//这里color,anotherColor,tempColor三个变量都可以访问
}

//这里可以访问color和anotherColor, 但不能访问tempColor,swapColors()
}

//这里只能访问color和changeColor();


没有块级作用域(有点困惑)
if (true) {
var color = "blue";
}
alert(color); //"blue"

if语句里定义变量color, 如果在C家族会在if执行后销毁,但JavaScript中if语句中的变量声明会将变量添加到当前执行环境中. 尤其是for语句

for(var i = 0; i < 10; i++) {
doSomething(i);
}

alert(i); //10对于有块级作用域的语言来说for语句初始化变量的表达式所定义的变量,只会存在for语句中

声明变量

使用var声明的变量会自动被添加到最接近的环境中. 在函数内部就是函数的局部环境;

function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
var result = sum(10, 20);//30
alert(sum);//由于sum不是有效的变量,因此会导致错误

查询标识符

先从作用域链的前端查找逐级向上,如果在局部环境中找到就停止搜索

var color = "blue";
function getColor() {
return color;
}
alert(getColor()); //blue
var color = "blue";
function getColor() {
var color = "red";
return color;
}

alert(getColor());  //"red"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript