JavaScript执行环境及作用域

来源:互联网 发布:淘宝屈臣氏燕窝面膜 编辑:程序博客网 时间:2024/06/05 22:56

(还是看代码比较直观...)

执行环境(环境): 定义了变量或函数有权访问的其他数据,决定了它们各自的行为.

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

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);//30alert(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"



0 0
原创粉丝点击