从Mozilla Doc https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures



function makeFunc() {
  var name = "Mozilla";
  function displayName() {
    alert(name);
  }
  return displayName;
}

var myFunc = makeFunc();
myFunc();


displayName不是真正的闭包,因为它关闭了其外部函数makeFunc的范围以供以后使用? Mozilla说makeFunc是闭包:


  解决此难题的方法是,myFunc已变为闭包。闭包是一种特殊的对象,它结合了两件事:一个函数以及创建该函数的环境。


我记得读过不同的定义。

Mozilla也对他们说的以下代码自相矛盾:

function init() {
    var name = "Mozilla"; // name is a local variable created by init
    function displayName() { // displayName() is the inner function, a closure
        alert (name); // displayName() uses variable declared in the parent function
    }
    displayName();
}
init();



  init()创建一个局部变量名,然后一个名为displayName()的函数displayName()是内部函数(闭包)—它在init()内部定义,并且仅在该函数的主体内可用。


因此,总而言之,他们说内部功能和外部功能都已关闭。

抱歉的问题已解决。我把'myFunc'误读为'makeFunc'-_-

最佳答案

我认为您误读了文档-myFunc是闭包,就像您认为的那样是makeFunc


  init()创建一个局部变量名,然后创建一个名为displayName()的函数。 displayName()是内部函数(闭包)—在init()内部定义,并且仅在该函数的主体内可用。与init()不同,displayName()没有自己的局部变量,而是重用在父函数中声明的变量名。


只需将init替换为makeFunc并将上面的引号应用于您的代码即可。 displayName是返回的内容,因此是暴露的。这是一个可以访问var name的函数对象。
因此,是的,displayName是一个闭包,它是由makeFunc创建并返回的闭包。

当您将此返回的闭包分配给变量时,该变量就是该闭包。在您的情况下,为myFunc分配了createFunc的返回值,这意味着它被分配了一个可以访问var displayName的函数实例(在其内部称为name)。
下次调用createFunc时,将创建一个新的name变量,并创建一个新的displayName函数。如果将其分配给另一个var,则即使有两个闭包,即使它们内部使用了相同的变量名,并且它们都由相同的函数返回,也有2个闭包。



在JS中,函数是一流的对象(意味着它们可以像其他任何值一样传递和分配)。这意味着:

var foo = function (bar) //assign function to variable foo
{
    return function()//this function will return a function
    {
        bar();//that invokes bar, an argument passed to the outer function
        alert('bar was invoked');
    };
}
var closure = foo(function(){ alert('test');});//pass function to foo
//returns the inner function, that invokes the function we just passed:
closure();//will alert "test", and then "bar was invoked"
var closure2 = foo(function(){ alert('a new closure');});
closure2();//alerts "a new closure" and "bar was invoked"
closure();// still alerts the same

关于javascript - 实际的关闭是哪个功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24280243/

10-12 13:28