我把这两个闭包函数搞混了。
当我将该函数赋值给变量test时,doSomeMath返回该函数而不执行它。它只会在我测试()时运行闭包函数;但是对于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();
发布于 2018-04-22 04:46:20
这两个函数是演示闭包如何工作的两种不同方式。
你可以很容易地做相反的事情来达到同样的效果。
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
变量上具有闭包。
另一个答案提供了对闭包的简明理解。要了解更多信息,请阅读closures以更好地理解上述示例。
发布于 2018-04-22 04:03:12
我认为你混淆了闭包和高阶函数。
没有手动调用函数的概念。必须始终调用函数。如果函数是闭包,这一点不会改变。
事实上,有人可能会说,这是闭包作为一种抽象机制的本质力量。
闭包是引用其封闭作用域中的元素的函数。
这通常被称为词法作用域。
闭包引用的封闭作用域的元素集称为闭包环境。
不引用其封闭作用域中的元素的函数可以被认为是退化闭包-具有空环境的闭包。
一个函数返回的值可以是另一个函数,但这与闭包的概念是完全正交的。
在JavaScript中,就像在许多语言中一样,函数是第一类值。这意味着它们可以存储在变量中,作为参数传递,并作为结果返回。
考虑一下
var createIncrement = function (incrementBy) {
return function (value) {
return value + incrementBy;
};
};
上面的函数是高阶的,因为它返回一个函数。顺便说一下,它也是一个闭包,因为它引用了在封闭作用域中声明的incrementBy
。
在您的问题框架中表达的困惑很可能是因为在实践中,即使是最简单的JavaScript程序也会同时使用这两个特性。
https://stackoverflow.com/questions/49962276
复制相似问题