匿名函数范围内?

No *_*ing 14 javascript

我来自一个Actionscript背景和(很晚才到派对)我正在努力学习JavaScript.我正在浏览这个AngularJS - YouTube上的初学者视频教程(非常好),看到一些我不理解的基本内容.

在第5行var workcount定义.然后定义两个匿名函数并在对象中返回.函数引用workcount但不在workcount不同的范围内?这是blocks在Objective-C中,在块内可以访问本地变量.这是什么名字?

或者,如果函数"知道"先前在其范围内定义的变量,那么函数是否task2"知道" task1

让我感到困惑的是我无法理解这一点.

更新:感谢所有回复.我现在明白了 - 虽然之前我已经看过"封闭"一词,但我从未理解它(它似乎不是一个非常具有描述性的术语.在阅读中,我看到了"叠帧"一词,然后灯泡点亮了:stack ...参考框架);


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();
Run Code Online (Sandbox Code Playgroud)

输出:

task1 1
task2 2
Run Code Online (Sandbox Code Playgroud)

Raj*_*ddy 12

请注意,变量和两个匿名函数都包含在同一个函数中(让我们称之为父函数).因此,此父函数中可以使用此变量的范围.

所以现在这个变量充当这两个内部函数的全局变量但是范围仅限于父函数.两个内部函数共享相同的变量.在一个函数中更改变量的值也会在其他函数中起作用.

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

此范围概念在JavaScript中称为闭包.


Enj*_*ayy 9

这在JavaScript中称为闭包.

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

基本上,createWorker是一个范围,因为任务1和任务2在createWorker中声明,所以它们可以访问createWorkers范围中声明的所有变量.

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

  • 问:"这是什么名字?".答:"这在javascript中被称为封闭."nuff说+1 (2认同)