相关疑难解决方法(0)

JavaScript闭包如何工作?

您如何向知道其所包含概念的人(例如函数,变量等)解释JavaScript闭包,但不了解闭包本身?

我已经看过维基百科上给出的Scheme示例,但遗憾的是它并没有帮助.

javascript variables closures scope function

7644
推荐指数
82
解决办法
139万
查看次数

循环内的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万
查看次数

Javascript臭名昭着的循环问题?

我有以下代码片段.

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function () {
            alert(i);
        };
        document.body.appendChild(link);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码用于生成5个链接,并使用alert事件绑定每个链接以显示当前链接ID.但它不起作用.当您单击生成的链接时,他们都会说"链接5".

但是以下代码片段可以满足我们的期望.

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function (num) {
            return function () {
                alert(num);
            };
        }(i);
        document.body.appendChild(link);
    }
}
Run Code Online (Sandbox Code Playgroud)

以上两个片段均引自此处.正如作者的解释,似乎关闭使魔术.

但它是如何工作的以及闭包如何使其工作都超出了我的理解范围.为什么第一个不工作而第二个工作?任何人都可以详细解释这个魔法吗?

谢谢.

javascript closures

216
推荐指数
5
解决办法
7万
查看次数

有什么方法可以扩展javascript的array.sort()方法来接受另一个参数?

我正在尝试对一组对象进行排序.我不想为每个属性编写自定义排序方法.

无论如何我可以扩展内置array.sort()方法来接受一个额外的参数,描述要排序的属性?例如,

array.sort(function(a, b, attr) { return a.attr - b.attr; }, 'name');
Run Code Online (Sandbox Code Playgroud)

javascript

57
推荐指数
3
解决办法
2万
查看次数

我何时使用括号,何时不使用括号?

我怎么能说:

var myFunction = function() {
   setTimeout(myFunction, 1000);
}
myFunction();
Run Code Online (Sandbox Code Playgroud)

为什么函数调用setTimeout不需要括号,但最后一行呢?

javascript

10
推荐指数
3
解决办法
2270
查看次数

标签 统计

javascript ×5

closures ×3

function ×1

loops ×1

scope ×1

variables ×1