Javascript 返回函数的参数从何处获取其值?
我不知道我是否为这个问题选择了正确的标题,也许这就是为什么我也找不到这个问题的答案 在阅读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
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){