ECMAScript 6介绍了该let声明.我听说它被描述为"本地"变量,但我仍然不太确定它与var关键字的行为有何不同.
有什么区别?何时应该let使用var?
var funcs = [];
// let's create 3 functions
for (var i = 0; i < 3; i++) {
// and store them in funcs
funcs[i] = function() {
// each should log its value.
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
// and now let's run each one to see
funcs[j]();
}Run Code Online (Sandbox Code Playgroud)
它输出这个:
我的价值:3
我的价值:3
我的价值:3
而我希望它输出:
我的价值:0
我的价值:1
我的价值:2
使用事件侦听器导致运行函数的延迟时,会出现同样的问题:
var buttons = document.getElementsByTagName("button");
// let's create 3 …Run Code Online (Sandbox Code Playgroud)出于某种原因,无论如何,pageNumber最终成为loopCounter循环中的最后一个值.现在我明白如果我在闭包本身直接使用loopCounter,但我不是.从下面的代码中可以看出,我在闭包中创建了一个新变量来获取loopCounter的当前值.
我只能想到的是(假设javascript将所有内容都视为引用类型)pageNumber正在引用loopCounter,所以无论我创建一个新的pageNumber有多少次,它总是指向loopCounter对象.因此,loopCounter最终得到的值将是任何pageNumber将指向的值.
我如何让它不指向loopCounter但是每次迭代创建一个新的pageNumber,它保存当前的loopCounter值?
for (var loopCounter = result.StartingPoint; loopCounter <= result.HighestPageCount; loopCounter++)
{
...
var newDiv = document.createElement('div');
...
//trying to remove the reference to loopCounter
var pageNumber = loopCounter;
newDiv.onclick =
function(event)
{ //Right here ---V
getResultUsingUrl(result.PagerPreLink + "&pageNumber=" + pageNumber);
};
...
}
Run Code Online (Sandbox Code Playgroud)
解
感谢以下几个答案:
function createClickMethod(loopCounter, link)
{
var pageNumber = loopCounter;
return function(event) { getResultUsingUrl(link + "&pageNumber=" + pageNumber); };
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样打电话:
newDiv.onclick = createClickMethod(loopCounter, result.PagerPreLink);
Run Code Online (Sandbox Code Playgroud)
或者,如果我想使用jQuery ...建议如下:
jQuery(newDiv).click
(
createClickMethod(loopCounter, result.PagerPreLink)
);
Run Code Online (Sandbox Code Playgroud)