Javascript 返回函数的参数从何处获取其值?

Javascript 返回函数的参数从何处获取其值?,javascript,closures,Javascript,Closures,我不知道我是否为这个问题选择了正确的标题,也许这就是为什么我也找不到这个问题的答案 在阅读javascript书籍时,我在讨论闭包时发现了这个示例 function multiplier(factor){ console.log('factor:'+factor); return function(number){ console.log('number:'+number) return number * factor; }; } var

我不知道我是否为这个问题选择了正确的标题,也许这就是为什么我也找不到这个问题的答案

在阅读javascript书籍时,我在讨论闭包时发现了这个示例

function multiplier(factor){
    console.log('factor:'+factor);
    return function(number){
        console.log('number:'+number)
        return number * factor;
    };
}

var twice = multiplier(2);
console.log('twice:'+twice(5));
在控制台中,我得到以下输出:

factor:2
number:5
twice:10
我理解闭包是什么意思,但我不理解变量数是如何得到值的,据我所知,变量数是
未定义的

我的理由如下:

当我调用函数
乘数(2)
时,本地变量因子被赋值为
2
,因此第一个输出是正确的。 但是,当它到达返回函数(number){行时,它应分配number
未定义的
,因为之前没有为这样的名称分配值

所以它将崩溃,并且没有正确地执行我得到的输出

有谁能帮我理解为什么调用
两次(5)
它会得到输出
编号:5

谢谢大家,请原谅,如果我没有以正确的方式发布问题,请随意修改任何内容以使此问题更易懂。

返回函数(数字){…}
返回一个函数。
number
不是一个变量,它是一个函数参数。与
函数乘数(factor)
中的
factor
是一个参数的方式相同。它既不是
未定义的
,也不会导致任何崩溃

本质上,
multiplier(2)
返回此函数:

function (number) {
    console.log('number:' + number)
    return number * 2;
}
…您分配给
两次
,因此
两次
现在是上述函数。

返回函数(数字){…}
返回函数。
数字
不是变量,而是函数参数。与
函数乘数(系数)中的
因子
相同
是一个参数。它既不是未定义的,也不会导致任何崩溃

本质上,
multiplier(2)
返回此函数:

function (number) {
    console.log('number:' + number)
    return number * 2;
}

…您将其分配给
两次
,因此
两次
现在是上述函数。

我认为您在这里缺少的关键点是,返回的函数与任何其他函数一样工作。函数在被调用之前不会被输入

return number * factor;
直到你调用
两次才运行

console.log('factor:'+factor);

直到调用
乘法器
才运行。函数体在调用该函数之前不会被输入。
数字
在调用
两次
之前没有值,但是使用
数字
的代码在调用
两次
之前也不会运行。

我认为您缺少她的关键点就是说,返回的函数的行为与任何其他函数一样。函数在被调用之前不会被输入

return number * factor;
直到你调用
两次才运行

console.log('factor:'+factor);
在调用
乘数
之前不会运行。在调用函数之前不会输入函数体。
数字
在调用
两次
之前不会有值,但是使用
数字
的代码在调用
两次
之前也不会运行

return number * factor;
但是,当它到达行返回函数(number){时,它应分配未定义的number,因为之前没有为这样的名称分配值

误解就在这里。记住:在Javascript中,几乎所有东西都是对象。有些人会说你经常与之交互的很多东西(字符串、数字、布尔(注意我是如何将这些类型/原语/单词放在小写字母的第一位的。我通常用大写字母表示类,小写字母表示原语))是原语,不是对象。这是真的,但是为了这个线程的目的,让我们考虑(几乎)所有的东西都是一个对象。< /P> 让我们回到你写的这句话:

当它到达行返回函数(number){时,应分配未定义的编号

问题是:当它到达“returnfunction(number){}”行时,它实际上返回一个函数,这是一个对象

它不执行此函数,只声明它,并将其作为对象返回

你可以写“return666”,它会返回一个对象,一个数字

让我们继续。 您的变量“tweep”现在包含一个函数。猜猜是哪一个。这一个:

功能(编号){ console.log('编号:'+编号) 返回数*因子; }

请记住,您已经声明了它,并且只在一条语句中返回了它: “返回函数(数字){…}”

您的“tweep”变量现在相当于一个命名函数,您可以这样声明:

功能两次(数字){ console.log('编号:'+编号) 返回数*因子; }

是的,函数是对象,命名函数类似于命名变量,变量可以是函数

您可以这样称呼它,例如:两次(9),或者这样称呼:两次(5)。 你就是这么做的

现在让我们回答你的问题:

为什么要调用两次(5)以获得输出号码:5

因为:

var两次=函数(数字){ console.log('编号:'+编号) 返回数*因子; }

您已经执行了“两(5);”,这反过来又执行了console.log,如下所示:

控制台日志('编号:'+5)

据我所知,在“function multiplier()”中,您不希望返回函数,而是希望返回该函数本身的结果。我建议您阅读IIFE(立即调用的函数表达式)。 有了这一点,您将能够在一个声明中: -声明函数 -执行该功能 -(并最终返回其结果)

玩Javascript玩得开心。Javascript很棒,只有当你知道背后发生了什么

但是当它到达行返回函数(number){