当定义一个函数时,为什么我需要返回一个函数而不是直接返回我想要的值?

When defining a function, why do I need to return a function instead of returning the value I want straightaway?

本文关键字:一个 返回 函数 我想要 定义 为什么      更新时间:2023-09-26

我对嵌套函数在另一个函数中的概念不熟悉,我不理解返回函数而不是直接返回我想要的值的必要性。

感谢任何帮助我澄清我的困惑!

第一个方法(我本能地会写,但结果是错误的):

function wrapValue(n) {
  var localVariable = n;
  return localVariable;
}
var wrap1 = wrapValue(1);
var wrap2 = wrapValue(2);
console.log(wrap1());
console.log(wrap2());
// → Uncaught TypeError: number is not a function 

我尝试了方法1的一个更简单的版本(方法1.1):

function wrapValue(n) {
  var localVariable = n;
  return localVariable;
}
console.log(wrapValue(6));
// → 6

第二种方法(正确的方法):

function wrapValue(n) {
  var localVariable = n;
  return function() { 
    return localVariable; 
  };
}
var wrap1 = wrapValue(1);
var wrap2 = wrapValue(2);
console.log(wrap1());
console.log(wrap2());
// → 1
// → 2

方法1.1可以工作,为什么方法1不能工作?为什么需要方法2?

谢谢你的帮助!

方法1.1可以工作,为什么方法1不能工作?

因为在方法1中,你试图调用你从wrapValue得到的值,好像它是一个函数,但它不是;这是一个号码(你输入的号码)。在方法1.1中,您直接使用返回值,而不是像调用函数那样调用它。

让我们来分解一下:

var wrap1 = wrapValue(1);

现在,在wrap1中,我们有数字1。不是一个函数,只是一个数字。因此,要使用数字,我们只需直接使用它:

console.log(wrap1); // 1

你不能调用 wrap1,因为变量不指向函数,它包含一个数字。

为什么需要方法2?

你只需要方法2,如果你有一些原因,你需要访问localVariable发生当你调用函数wrapValue返回。下面是一个示例,显示了可能发生的变化:

function doSomething(n) {
    var num = n;
    return function() {
        ++num;
        return num;
    };
}
var f = doSomething(0);
console.log(f()); // 1
console.log(f()); // 2
console.log(f()); // 3

因为调用函数doSomething返回会改变变量num的值,我们希望每次调用它时都得到最新的版本。

在这里,我使用了一个局部变量,使其类似于您的原始示例,但我们可以直接使用n:

function doSomething(n) {
    return function() {
        ++n;
        return n;
    };
}
var f = doSomething(0);
console.log(f()); // 1
console.log(f()); // 2
console.log(f()); // 3

函数参数实际上是函数中的局部变量。(实际上,而不是字面上)

你的第一个函数出错了,它应该是:

function wrapValue(n) {
  var localVariable = n;
  return localVariable;
}
var wrap1 = wrapValue(1);
var wrap2 = wrapValue(2);
console.log(wrap1);
console.log(wrap2);

和预期的一样。

方法1完全是错误的。

当你调用wrapValue时,你返回localVariable,它被设置为12,这些是数字,不能作为函数调用。

这也是你在方法1.1中所经历的。

对于方法2,这可能是隔离不希望流到父作用域的变量的一种方法。它在你的例子中没有用,但在你立即调用定义的函数的情况下,它是广泛的,例如:

var myFn = function() {
    var hiddenVar = 1;
    return function() {
        return hiddenVar;
    };
}();

我可以回答你的第一个问题:为什么方法1不工作?

当你做var localVariable = n;时,你创建了一个名为localVariable的新变量,并为它分配了类型数字和值n。你返回这个整型值n

因此,wrap1wrap2是数字。它们不支持只适用于函数的()操作。在方法1.1中,您直接记录wrapValue(...),这与记录数字相同,这是有效的。

希望你能理解。:)

在第一个示例中,您将wrap1 &2 .返回的函数都是数字,然后将给定的数字作为函数调用。

var wrap1 = wrapValue(1); // wrap1 =  1;
var wrap2 = wrapValue(2); // wrap2 =  2;