Javascript 闭包自动调用与手动调用



我在这两个闭包函数之间感到困惑。

doSomeMath 返回函数而不执行它,当我将其分配给变量时,测试。它只会在我做 test() 时运行闭包函数; 但是,showName 函数并非如此。一旦我传入值,它就会立即调用闭包函数而不是返回它。

有人可以向我解释一下吗?谢谢。

function showName (firstName, lastName) {
var nameIntro = "Your name is ";
// this inner function has access to the outer function's variables, including the parameter
function makeFullName () {     
var full = nameIntro + firstName + " " + lastName; 
return full;   
}
return makeFullName ();
}
showName ("Michael", "Jackson"); // Your name is Michael Jackson

function doSomeMath(a, b) {
var a = a;
var b = b;
function multiply() {
var result = a * b;
return result;
}
return multiply;
}
var test = doSomeMath(5,10);
test();

这两个函数是演示闭包工作原理的两种不同方式。

您可以轻松地做相反的事情来达到相同的效果。

function doSomeMath(a, b) {
var a = a;
var b = b;
function multiply() {
var result = a * b;
return result;
}
return multiply();
}
doSomeMath(5,10) //50

在上面的代码中,您返回调用内部函数的结果,而不是函数本身。在这里,如您所见,multiply的闭包超过 5 和 10,因此您得到的结果为 50。

同样,请尝试:

function showName (firstName, lastName) {
var nameIntro = "Your name is ";
// this inner function has access to the outer function's variables, including the parameter
function makeFullName () {     
var full = nameIntro + firstName + " " + lastName; 
return full;   
}
return makeFullName;
}
var show = showName ("Michael", "Jackson");
show() //"Your name is Michael Jackson"

上面的代码返回内部函数而不是其调用,并反过来演示内部函数如何makeFullName外部函数的nameIntro变量上闭包。

另一个答案提供了对闭包的简明理解。要了解更多信息,请阅读闭包以更好地理解上述示例。

我认为您混淆了闭包和高阶函数。

没有手动调用函数这样的概念。必须始终调用函数。如果函数是闭包,则这不会更改。

事实上,有人可能会说,这就是闭包作为一种抽象机制的基本力量。

闭包是引用其封闭范围内的元素的函数。

这通常称为词法范围。

闭包引用的封闭范围的元素集称为其环境。

不引用其封闭作用域中的元素的函数可以被认为是退化闭包 - 具有空环境的闭包。

函数返回的值可能是另一个函数,但这完全与闭包的概念正交。

在JavaScript中,就像在许多语言中一样,函数是第一类值。这意味着它们可以存储在变量中,作为参数传递,并作为结果返回。

考虑

var createIncrement = function (incrementBy) {
return function (value) {
return value + incrementBy;
};
};

上面的函数是高阶的,因为它返回一个函数。顺便说一下,它也是一个闭包,因为它引用了在封闭作用域中声明的incrementBy

在问题框架中表达的困惑可能源于这样一个事实,即在实践中,这两个功能将同时用于最简单的JavaScript程序。

最新更新