2 yzmspirit yzmspirit 于 2014.08.06 16:33 提问

一段javascript代码,不太懂闭包机制

function setup(x){
var i = 0;
return function(){
return x[i++]
}

}

var next = setup(['a','b','c']);

然后不断调用next()

next(); // 'a'
next(); // 'b'
next(); // 'c'

不太明白,为什么i值不会重新初始化为0呢,这儿的机制是怎么样的

2个回答

zhouhua0104
zhouhua0104   2014.08.06 16:57
已采纳

个人一点理解,因为javascript闭包的一个用途就是一些变量的值始终保持在内存中,你定义的next为全局变量其实是
return function(){
return x[i++]
}这个函数,姑且定义为f2()因为f2()被赋予了一个全局变量next,所以f2()会一直存在内存中,然而f2()又依赖于setup(x),所以setup(x)也会一直存在内存中,所以i的值会递增而不是每次都初始化为0.

ailby0709
ailby0709   2014.08.06 17:01

next 是setup的实例化对象,类似于C#的new,所以i相当于对象next的全局变量。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
理解 Javascript 的闭包 (例子举得很好)
转自:http://www.oschina.net/question/28_41112?fromerr=UAPtt2Ce 前言:还是一篇入门文章。Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性。本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来
由浅入深理解闭包的运行机制
先来看看闭包的定义:指有权访问另一个函数作用域中的变量的函数。创建闭包的常用方式就是在一个函数内部创建另一个函数,先来看一个例子:function createComparsionFunction(propertyName) { return function(object1, object2) { var value1 = object1[propertyName];
JavaScript的闭包到底是什么
百度百科的解释是:闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在PHP、Scala、Scheme、Common Lisp、S
分享一些前端开发中最常用的JS代码片段以及理解 JS闭包
记得几年前刚工作那时,听到高大上的 JS闭包 一词 让我一头雾水,很多初学者也许和我当时一样困惑,其实 闭包 也并没那么高深莫测。 今天我写了篇简单的学习笔记 希望能帮助大家轻松理解 JS闭包。 参考资料:1.《你所不知道的JavaScript-上卷》闭包和作用域章节、2. 阮一峰老师的《学习JavaScript闭包》 ( 大家学习时 为了更好理解,最好跟着本文内容 在IDE或浏览器控制
几行代码让你明白什么叫做闭包
var Calculator = (function() { var operand, operator; function impl_add (x, y) { return x + y; } function impl_minus (x, y) { return x - y; } var exports = {}; exports.add = impl_add; ex
《你不知道的JavaScript(上卷)》笔记:作用域闭包
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。 function foo() { var a = 2; function bar(){ console.log(a); } return bar; ...
javascript闭包高级教程
javascript闭包高级教程,闭包内部实现机制的完美展现,值得研究,比较难。
JS变量提升、匿名函数、原型继承、作用域、闭包机制等。
JS变量提升:JavaScript中变量提升 Hoisting:http://zha-zi.iteye.com/blog/2037026变量提升,很简单,就是把变量提升提到函数的top的地方。我么需要说明的是,变量提升 只是提升变量的声明,并不会把赋值也提升上来。 函数提升是把整个函数都提到前面去。 在我们写js code 的时候,我们有2中写法,一种是函数表达式,另外一种是函数声明方式。我们
javascript理解之变量作用域与闭包
何为闭包闭包是指能够访问自由变量的函数 (变量在本地使用,但在闭包中定义)。换句话说,定义在闭包中的函数可以“记忆”它被创建时候的环境。函数作用域与声明提前var scope= "global scope"; function f(){ console.log(scope); //undefined,并没有出现"global scope" var scope="local scope";
JavaScript闭包造成内存泄漏的一个例子
看下面代码:function readData() { var buf = new Buffer(1024 * 1024 * 100) var index = 0 buf.fill('g') return function() { index++ if (index < buf.length) { return buf[index-1]