匿名函数内的作用域?

新手上路,请多包涵

我来自 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 许可协议

阅读 317
2 个回答

请注意,变量和两个匿名函数都包含在同一个函数中(我们称它为父函数)。所以这个变量的范围在这个父函数中是可用的。

所以现在这个变量作为这两个内部函数的全局变量, 但是作用域仅限于父函数。两个内部函数共享同一个变量。在一个函数中更改变量的值也会对其他函数产生影响。

所以按照帖子中的逻辑假设我们一个接一个地执行task1和task2。该变量最初设置为 0。然后在您的 task1 中将其递增 1。这使得变量值为 1 (0 + 1)。现在在任务二中它也增加了 1,使其值为 2 (1 + 1)。

这个作用域概念在 JavaScript 中称为 闭包

原文由 Rajshekar Reddy 发布,翻译遵循 CC BY-SA 3.0 许可协议

这在 JavaScript 中称为闭包。

JavaScript 中闭包的范围是词法的,这意味着闭包所属函数中包含的所有内容都可以访问其中的任何变量

基本上 createWorker 是一个作用域,因为任务 1 和任务 2 是在 createWorker 内部声明的,所以它们可以访问在 createWorkers 作用域中声明的所有变量。

但是 createWorker 无法访问任务 1 和任务 2 中声明的任何变量。

原文由 Enjayy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏