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

自动调用Javascript闭包与手动调用Javascript闭包,javascript,closures,Javascript,Closures,我混淆了这两个闭包函数 当我将doSomeMath赋值给变量test时,doSomeMath返回函数而不执行它。它将只运行关闭功能时,我做测试; 但是,showName函数并非如此。我一传入值,它就会立即调用闭包函数,而不是返回它 有人能给我解释一下吗?谢谢 function showName (firstName, lastName) { var nameIntro = "Your name is "; // this inner function has access to

我混淆了这两个闭包函数

当我将doSomeMath赋值给变量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();

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

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

事实上,有人可能会说,这是闭包作为抽象机制的基本功能

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

这通常被称为词汇范围界定

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

一个不引用其封闭范围内元素的函数可以被视为退化闭包——一个具有空环境的闭包

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

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

考虑

var createIncrement = function (incrementBy) {
  return function (value) {
    return value + incrementBy;
  };
};
上面的函数是高阶的,因为它返回一个函数。顺便提一下,它也是一个闭包,因为它引用incrementBy,incrementBy在封闭范围内声明


在你的问题框架中表达的混乱可能是因为,实际上,即使是最简单的JavaScript程序,这两个功能也会一起使用。

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

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

事实上,有人可能会说,这是闭包作为抽象机制的基本功能

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

这通常被称为词汇范围界定

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

一个不引用其封闭范围内元素的函数可以被视为退化闭包——一个具有空环境的闭包

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

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

考虑

var createIncrement = function (incrementBy) {
  return function (value) {
    return value + incrementBy;
  };
};
上面的函数是高阶的,因为它返回一个函数。顺便提一下,它也是一个闭包,因为它引用incrementBy,incrementBy在封闭范围内声明


在你的问题框架中表达的混乱可能是因为,在实践中,即使是最简单的JavaScript程序也会同时使用这两个功能。

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

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

function doSomeMath(a, b) {
    var a = a;
    var b = b;

    function multiply() {
        var result = a * b;
        return result;
    }

    return multiply();
}

doSomeMath(5,10) //50
在上面的代码中,您返回调用内部函数的结果,而不是函数本身。在这里,你可以看到,乘法有一个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变量上具有闭包


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

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

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

function doSomeMath(a, b) {
    var a = a;
    var b = b;

    function multiply() {
        var result = a * b;
        return result;
    }

    return multiply();
}

doSomeMath(5,10) //50
在上面的代码中,您返回调用内部函数的结果,而不是函数本身。在这里,你可以看到,乘法有一个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变量上具有闭包


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

我不明白这个问题——它和你说的一模一样。其中一个返回一个函数,另一个返回一个值,该值是立即调用的函数的结果。@CertainPerformance Yes。为什么会这样?第一个返回righ值
当第二个函数返回functionreturn makeFullName时,t将消失;vs返回乘法;。您可以看到第一个正在被调用,而第二个没有被调用。但是,您应该将更好的函数名设置在它们的名称旁边parentheses@CertainPerformance哦,我的上帝!我一遍又一遍地查看代码,没有注意到这一点。非常感谢。你可能想了解一下MDN。我不明白这个问题——它和你说的一模一样。其中一个返回一个函数,另一个返回一个值,该值是立即调用的函数的结果。@CertainPerformance Yes。为什么会这样?第一个函数立即返回值,第二个函数返回functionreturn makeFullName;vs返回乘法;。您可以看到第一个正在被调用,而第二个没有被调用。但是,您应该将更好的函数名设置在它们的名称旁边parentheses@CertainPerformance哦,我的上帝!我一遍又一遍地查看代码,没有注意到这一点。非常感谢。您可能想了解有关MDN的信息。