码迷,mamicode.com
首页 > Web开发 > 详细

关于js闭包的误区

时间:2016-11-05 20:53:27      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:执行   而不是   ons   闭包   height   循环   高级   存在   this   

一直以为js的闭包只是内部函数保存了一份外部函数的变量值副本,但是以下代码打破了我的认识:

function createFunctions()
{
	var result = new Array();

	for(var i=0;i<10;++i)
	{
		result[i] = function()
		{
			return i;
		}
	}

	return result;
}

var funcs = createFunctions();
for(var i=0;i<10;++i)
{
	console.log(funcs[i]());
}

  执行结果是10个10 而不是0-9

看了JS高级编程7.2.1之后才明白 变量i并不是存在于匿名函数的局部变量表,而是存储在createFunctions的活动对象表(存储参数和局部变量)中。并且在创建函数的定义过程中匿名函数只是被定义而没有被执行。直到后面输出的循环被定义的匿名函数们才得以执行,而这时候它们的活动对象表里并不存在i,然后它们就会从作用域链向上查找createFunctions的活动对象表中的i。这时i的值已经是10,因此它们的执行结果全是10。

以下代码在闭包外部再加入了一个含参数的闭包,并且在定义之后调用,传递进去当前的i。这时这层新增的闭包活动对象表中含有参数num会存储i的当前值。这样结果就是0-9了:

 1 function createFunctions()
 2 {
 3     var result = new Array();
 4 
 5     for(var i=0;i<10;++i)
 6     {
 7         result[i] = function(num)
 8         {
 9             return function(){
10                 return num;
11             }
12         }(i);
13     }
14     return result;
15 }
16 
17 var funcs = createFunctions();
18 for(var i=0;i<10;++i)
19 {
20     console.log(funcs[i]());
21 }

闭包的活动对象表中并不会包含this,this是当前执行上下文中的概念,会随着调用环境而变化。

 

关于js闭包的误区

标签:执行   而不是   ons   闭包   height   循环   高级   存在   this   

原文地址:http://www.cnblogs.com/fancybit/p/js_closeture_mistake.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!