相关疑难解决方法(0)

使用"let"和"var"在JavaScript中声明变量有什么区别?

ECMAScript 6介绍了该let声明.我听说它被描述为"本地"变量,但我仍然不太确定它与var关键字的行为有何不同.

有什么区别?何时应该let使用var

javascript scope var let ecmascript-6

4199
推荐指数
28
解决办法
111万
查看次数

循环内的JavaScript闭包 - 简单实用的例子

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)

javascript closures loops

2689
推荐指数
25
解决办法
34万
查看次数

可能访问修改后的关闭问题...如何打败?

出于某种原因,无论如何,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)

javascript closures

4
推荐指数
2
解决办法
671
查看次数

标签 统计

javascript ×3

closures ×2

ecmascript-6 ×1

let ×1

loops ×1

scope ×1

var ×1