首页 > 技术文章 > 《JavaScript高级程序设计》读书笔记--执行环境及作用域

limengyi 2016-12-13 20:51 原文

1、执行环境

执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象,执行环境中定义的所有变量和函数都保存在这个对象中。

2、作用域链

当代码在一个环境中执行时,会创建变量对象的一个作用域链

作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象(包含了执行环境中定义的所有变量和函数)。作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境。

关于JavaScript作用域链,简单地说,即是:
全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,直至全局函数,这种组织形式就是作用域链。

3、JavaScript没有块级作用域

需要注意的一点是,JavaScript没有块级作用域

在JavaScript中,if语句中的变量声明会将变量添加到当前执行环境。例:

	if(true){
		var color = "blue";
	}
	console.log(color);	//"blue"

如果是在C、C++或Java中,color会在if语句执行完毕后被销毁。而在JavaScript中,变量color被添加到当前执行环境(全局执行环境),所以它的值能正常地被输出。

对JavaScript来说,由for语句创建的变量i即使在for循环执行结束后,也依旧会存在于循环外部的执行环境中。例:

	for(var i = 0; i < 10; i++){
		dosomething(i);
	}
	console.log(i);	//10

4、用匿名函数模仿块级作用域

匿名函数可以用来模仿块级作用域。语法如下:

	(function(){
		//这里是块级作用域
	})();

以上代码定义并调用了一个匿名函数。将函数声明包含在一对圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号会立即调用这个函数。对于匿名函数在开发jQuery插件的应用可参看全屏滑动插件例子

以上为个人见解,望指教。

推荐阅读