Javascript Closure自动与手动调用

时间:2018-04-22 03:40:00

标签: javascript closures

我对这两个闭包函数感到困惑。

当我将函数分配给变量test时,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();

2 个答案:

答案 0 :(得分:0)

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

你可以很容易地做相反的事情来达到同样的效果。

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的信息,请更好地了解上述示例。

答案 1 :(得分:-1)

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

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

事实上,人们可能会说这是封闭作为抽象机制的基本力量。

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

这通常被称为词汇范围。

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

一个不引用其封闭范围内元素的函数可以被认为是一个简并闭包 - 一个空环境的闭包。

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

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

考虑

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

上面的函数是高阶函数,因为它返回一个函数。 顺便提一下也是一个闭包,因为它引用了在封闭范围内声明的incrementBy

在问题框架中表达的混淆可能源于这样一个事实,即在最简单的JavaScript程序中,这两个功能将一起使用。