我来自 Actionscript 背景并且(晚会很晚)我正在尝试学习 JavaScript。我正在观看这个 AngularJS - YouTube 上的初学者视频教程(它非常好)并且看到了一些我不理解的非常基本的东西。
在第 5 行定义了 var workcount
。然后在一个对象中定义并返回两个匿名函数。函数引用 workcount
但不是 workcount
在不同的范围内?这是否类似于 Objective-C 中的 blocks
,其中本地变量在块内仍然可以访问。这是什么东西的名字吗?
或者,如果函数“知道”先前在其范围内定义的变量,函数 task2
“知道” task1
吗?
这让我很烦恼,我无法理解这一点。
更新: 感谢所有回复。我现在明白了——虽然我以前见过术语“闭包”,但我从未理解它(这似乎不是一个描述性很强的术语。在阅读时,我看到了术语“堆栈框架”,然后灯泡亮了:堆栈…参考框架);
var createWorker = function(){
var workCount = 0;
var task1 = function(){
workCount += 1;
console.log("task1" , workCount);
};
var task2 = function(){
workCount += 1;
console.log("task2" , workCount);
};
return {
job1: task1,
job2:task2
}
};
worker=createWorker();
worker.job1();
worker.job2();
输出:
task1 1
task2 2
原文由 spring 发布,翻译遵循 CC BY-SA 4.0 许可协议
请注意,变量和两个匿名函数都包含在同一个函数中(我们称它为父函数)。所以这个变量的范围在这个父函数中是可用的。
所以现在这个变量作为这两个内部函数的全局变量, 但是作用域仅限于父函数。两个内部函数共享同一个变量。在一个函数中更改变量的值也会对其他函数产生影响。
所以按照帖子中的逻辑假设我们一个接一个地执行task1和task2。该变量最初设置为 0。然后在您的 task1 中将其递增 1。这使得变量值为 1 (0 + 1)。现在在任务二中它也增加了 1,使其值为 2 (1 + 1)。
这个作用域概念在 JavaScript 中称为 闭包。