Javascript 定义函数时,为什么需要返回函数而不是直接返回所需的值?

Javascript 定义函数时,为什么需要返回函数而不是直接返回所需的值?,javascript,Javascript,我对将一个函数嵌套在另一个函数中的概念不太熟悉,我不理解是否需要返回一个函数,而不是直接返回我想要的值 谢谢你帮我消除困惑 第一种方法(我本能地写下了,但结果却是错的): 我尝试了方法1的一个更简单的版本,该版本有效(方法1.1): 第二种方法(正确的方法): 当方法1.1起作用时,为什么方法1不起作用?为什么需要方法2 谢谢你的帮助 在第一个示例中,将函数的返回值指定给wrap1&2,这些返回值是数字,然后将给定的数字作为函数调用 var wrap1 = wrapValue(1); // wr

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

谢谢你帮我消除困惑

第一种方法(我本能地写下了,但结果却是错的):

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

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

当方法1.1起作用时,为什么方法1不起作用?为什么需要方法2


谢谢你的帮助

在第一个示例中,将函数的返回值指定给wrap1&2,这些返回值是数字,然后将给定的数字作为函数调用

var wrap1 = wrapValue(1); // wrap1 =  1;
var wrap2 = wrapValue(2); // wrap2 =  2;
当方法1.1起作用时,为什么方法1不起作用

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

让我们把它分解一下:

var wrap1 = wrapValue(1);
现在,在
wrap1
中,我们有编号
1
。不是函数,只是数字。所以要使用这个数字,我们直接使用它:

console.log(wrap1); // 1
function doSomething(n) {
    return function() {
        ++n;
        return n;
    };
}

var f = doSomething(0);
console.log(f()); // 1
console.log(f()); // 2
console.log(f()); // 3
您不能调用
wrap1
,因为变量没有引用函数,它包含一个数字

为什么需要方法2

只有在调用函数
wrapValue
返回时,出于某种原因需要访问
localVariable
时,才需要方法2。下面是一个示例,显示了这种情况可能发生的变化:

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

console.log(wrap1); // 1
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
时,返回设置为
1
2
localVariable
,这些都是数字,不能作为函数调用

var wrap1 = wrapValue(1); // wrap1 =  1;
var wrap2 = wrapValue(2); // wrap2 =  2;
这也是您在方法1.1中的体验

对于方法2,这可能是一种隔离不希望流入父范围的变量的方法。它在您的示例中没有用处,但在您立即调用已定义函数的情况下,它非常有用,例如:

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

    return function() {
        return hiddenVar;
    };
}();

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

当您执行
var localVariable=n
您创建了一个名为
localVariable
的新变量,并为其指定了类型编号和值n。然后返回这个整数值n

因此,
wrap1
wrap2
是数字。它们不支持只适用于函数的
()
操作。在方法1.1中,您可以直接记录
wrapValue(…)
,这与记录一个数字是一样的,这是有效的


希望您能理解。:)

在第一个示例中,您试图将
wrap1
作为函数调用。只需使用
console.log(wrap1)
。真不敢相信我盯着它看了这么久竟然错过了!!谢谢:)JavaScript没有整数,只有数字——这可能会增加混乱。