Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript充当值和闭包_Javascript - Fatal编程技术网

Javascript充当值和闭包

Javascript充当值和闭包,javascript,Javascript,我正在努力理解函数作为值,以及Javascript中的闭包 以《守则》为例 function multiplier(factor) { return function (number) {return number * factor; } } var i = multiplier(10); 在这一点上我到底持有什么?我知道我可以利用我的下一步 console.log(i(5)); 这将产生50的价值。但在此之前,我还是想知道Javascript到底给了我什么。I实际上是一个全新的函

我正在努力理解函数作为值,以及Javascript中的闭包

以《守则》为例

function multiplier(factor) {
    return function (number) {return number * factor; }
}
var i = multiplier(10);
在这一点上我到底持有什么?我知道我可以利用我的下一步

console.log(i(5)); 

这将产生50的价值。但在此之前,我还是想知道Javascript到底给了我什么。

I
实际上是一个全新的函数:
函数(number){returnnumber*10;}

所以如果你有
j=乘数(10)i
不是
j
,因为它们是两个不同的函数

还有一点需要注意的是,在
i之后=乘数(10)你不再有
因子
作为参考或价值,
因子
已经从你的
i

var i = multiplier(10);
实际上是
var i=function(number){returnnumber*10;}

然后调用
console.log时(i(5))
你在打电话吗

console.log(function(5){return 5* 10;})

考虑以下两个例子。第一个是你给的,第二个是我给的

在第一种情况下,可能会认为返回的函数是

function (number) {return number * 10; }
但事实并非如此,即使这样想很容易<代码>系数
保存为参数<代码>系数
的参考。因此,函数
multiplier
返回一个函数,其中引用了您提供的值

如果
因子的值改变,则函数结果不同

函数乘数(因子){
返回函数(数){返回数*因子;}
}
var i=乘数(10);
console.log('Example1',i(5))
函数乘法器2(系数){
setTimeout(()=>{factor=100},1000)
返回函数(数){返回数*因子;}
}
var i2=乘数2(10);
console.log('Example2',i2(5))

setTimeout(()=>{console.log('Example2',i2(5))},1100)
var i=function(number){return number*10;}
,这是
乘数
函数返回的结果。如果您认为答案足够,请不要忘记接受答案,按照礼仪,
10
是否实际上是
因子
,它保存为创建它的范围中的引用?如果在执行函数之前因子参数会发生变化,则来自
乘数(10)(5)
的答案不会是50。在
i=乘数(10)之后
你不再有
因子了。@Xin:那不是真的。您仍然有
因子
,这就是函数工作的原因。Javascript函数定义不替换变量值。相反,它引用了它们。这个“特性”被称为词法闭包(简称闭包)。谢谢Xin,我知道这些语句调用的是一个新的“实例”。我感兴趣的是Javascript如何使用/计算函数变量?谢谢。那么Javascript是否给了变量i,一个“冻结”函数,可以说不是一个不变的值呢?是的,你是对的。每次调用“乘数”函数时,它都会被指定为不可变值。@Mamun这不是真的。看看我的答案。返回函数后,可以更改因子。“factor”仅在执行时计算。@E.Sundin Yes factor仅在创建时特定于实例。您已经第二次调用了该函数,在这种情况下,该实例将是一个全新的实例。