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
在局部作用域中定义的变量可以在局部环境中与全局变量互换使用,如:
没有块级作用域(有点困惑)
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
执行环境(环境): 定义了变量或函数有权访问的其他数据,决定了它们各自的行为.
变量对象: 每个环境中都有一个变量对象,环境中定义的所有函数和变量都保存在这个对象中.
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 中的执行环境、作用域(scope)以及变量提升(hoisting)
- 从头开始学JavaScript (九)——执行环境和作用域
- JavaScript 执行环境及作用域
- 浅谈JavaScript 执行环境、作用域及垃圾回收
- javascript中的执行环境和作用域详解
- javascript执行环境(作用域)与作用域链深入剖析及项目经验
- Javascript高级程序设计——执行环境与作用域
- JavaScript:执行环境及作用域
- JavaScript执行环境及作用域
- javascript执行环境及作用域详解
- Javascript 函数及其执行环境和作用域
- Javascript 执行环境及作用域
- Javascript手记-执行环境和作用域
- JavaScript的执行环境和作用域
- javascript学习笔记 - 执行环境及作用域
- javascript的执行环境及作用域
- Javascript学习---2、执行环境,作用域
- Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
- javascript执行环境及作用域详解
- JavaScript作用域和执行环境