首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这种对javascript闭包的解释正确吗?

这种对javascript闭包的解释正确吗?
EN

Stack Overflow用户
提问于 2012-12-26 10:04:53
回答 2查看 125关注 0票数 1

对于tl;dr,在为表中的行创建单击处理程序时,使用闭包使函数指向内存中的相同位置,而不是像下面的代码那样每次都指向不同的位置。

否则:

我正在学习javascript,我想我明白了闭包是什么以及它为什么有用。这是我的推理;它是正确的吗?

对于HTML表,下面的代码总是显示被单击的最后一行,即使我单击了第一行或第二行。我的推理是代码创建了3个不同的堆栈帧,每个堆栈帧的i分别等于0、1和2。因为2是最新的堆栈帧,所以fnPtr的返回值指向2。

代码语言:javascript
复制
var table = document.getElementById("tableid3");
var rows = table.getElementsByTagName("tr");
for (var i = 0; i < rows.length; i++) {
    var curRow = table.rows[i];
    //get cell data from first col of row
    var cell = curRow.getElementsByTagName("td")[0]; 
    var fnPtr = function() {
        alert("row " + i + " data="+ cell.innerHTML);
    }
curRow.onclick = fnPtr;
}

现在,下面的代码(来自一个SO问题)使用了一个闭包,并且只创建了一个堆栈框架,即createfunc()的框架。但是在这个框架中有一个局部变量tmp,它指向匿名函数。当使用0、1和2调用createfunc()时,返回值指向相同的栈帧(createfunc()的栈帧内的栈帧),这意味着不会创建3个栈帧。当createfunc()每次返回时,返回值插槽中的值指向内存中的相同位置,而不是像上面的代码那样每次都指向不同的位置。

代码语言:javascript
复制
function createfunc(i) {
    var tmp = function() { console.log("My value: " + i); };
    console.log(tmp);
    return tmp;
}
for (var i = 0; i < 3; i++) {
    funcs[i] = createfunc(i);
}
for (var j = 0; j < 3; j++) {
    funcs[j]();                        // and now let's run each one to see
}

我理解闭包是如何工作的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-26 10:19:22

我不确定考虑javascript在堆栈框架中的工作方式是不是一个好主意-- javascript的级别太高了。

在第一个代码片段中,您创建的fnPtr函数对象捕获实际的变量(但还不是它的值),因此,如果该变量后来发生更改,则在调用该函数时,将使用当前时刻的i变量值。您的循环可能创建了100个fnPtr函数对象,但每个对象都包含对完全相同的i变量的引用。

第二个代码片段利用了这样一个事实:当您将一个原始值(例如一个数字)作为函数参数传递给一个函数时,javascript会创建它的一个副本。因此,每次调用createfunc时,都会创建一个新的变量副本,并将这个新变量的值设置为调用createfunc时参数所具有的任何值。我要强调的是,这是一个新变量,其他函数都不会引用它。因此,当createfunc返回一个新函数时,该新函数保存了对复制的新独占i变量的引用。

票数 0
EN

Stack Overflow用户

发布于 2012-12-26 10:21:57

这是关于作用域的,而不是堆栈。每个函数定义都会在JavaScript中创建一个新的作用域,并且函数总是可以访问它们的祖先作用域。

因此,在您的第一个示例中,fnPtr的所有实例都可以从父作用域访问相同的i。单击任意行时,for循环已经完成,i将为3。

在第二个示例中,每个返回的tmp函数都可以访问传递给工厂函数的i参数,该参数在每次迭代/调用时都是不同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14035317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档