从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/