Javascript 闭包语法
为清晰起见进行了更新Javascript 闭包语法,javascript,Javascript,为清晰起见进行了更新 有人能解释为什么(3)(10)是这样写的吗?我知道10是作为内部函数的参数提供的,但是为什么在语法上是这样标记的呢?如果我们有三个嵌套函数,参数是否总是按照(3)(10)(20)中的顺序写入?中间变量: function makeIncreaseByFunction(increaseByAmount) { return function (numberToIncrease) { return numberToIncrease + increaseByAmount
有人能解释为什么(3)(10)是这样写的吗?我知道10是作为内部函数的参数提供的,但是为什么在语法上是这样标记的呢?如果我们有三个嵌套函数,参数是否总是按照(3)(10)(20)中的顺序写入?中间变量:
function makeIncreaseByFunction(increaseByAmount) {
return function (numberToIncrease) {
return numberToIncrease + increaseByAmount;
};
}
makeIncreaseByFunction(3)(10);
var increaseBy3 = makeIncreaseByFunction(3);
var foo = increaseBy3(10);
没有中间变量:
function makeIncreaseByFunction(increaseByAmount) {
return function (numberToIncrease) {
return numberToIncrease + increaseByAmount;
};
}
makeIncreaseByFunction(3)(10);
var increaseBy3 = makeIncreaseByFunction(3);
var foo = increaseBy3(10);
在这两种情况下,第一次调用都会将参数3
传递给makeIncreaseByFunction
,结果返回已关闭的内部函数increaseByAmount
,其值为3
。无论您是为makeIncreaseByFunction
返回的中间函数创建变量,还是直接调用它,它都会执行相同的操作
您能否更详细地解释一下如何在var foo=makeIncremaseByFunction(3)(10)中;这10个是进入内部功能?它只是在语法上与Javascript中参数通常传递给我的方式不同ggg
makeIncreaseByFunction(3)
返回一个函数,特别是makeIncreaseByFunction
中定义的“内部函数”。和所有函数一样,使用函数(参数)
语法调用它。如果你觉得这样更有意义,你可以这样写:
var foo = makeIncreaseByFunction(3)(10);
这里发生的是makeIncreaseByFunction(3)
首先被调用并返回⟪内部功能⟫, 然后我们调用⟪内部功能⟫(10)
如果你是手工评估(我认为这就是你所说的“语法上”)的话,你可以这样一步一步地想:
( makeIncreaseByFunction(3) )(10)
注意:如果你想成为一名技术人员,我们在这里只做两件事——但除非你有Lambda微积分的背景,否则这可能会让你困惑,而不是帮助你
makeIncreaseByFunction(3)
将返回function
,因此用10调用它的语法将是makeIncreaseByFunction(3)(10)
这很容易理解,就好像您有一个函数foo
(假设makeIncreaseByFunction(3)的返回就是这样一个函数,它们的计算结果是相同的),然后您可以使用foo(10)
用10调用它
至于10的值是如何被“传递”的,这是一种错误的看待事物的方式
您必须认识到,在Javascript中,函数是第一类对象。
您不是将值传递给内部函数,而是创建一个执行所需操作的函数,然后使用外部参数调用它
这与使用非函数语言在函数中添加变量相同,只是函数可以在运行时动态创建,并且可以设置其定义中任何变量的值以影响其内部一致性
闭包指的是这样一个事实,即创建的函数是一个黑匣子,它隐藏了用于初始化它的变量,尽管仍然使用该变量来增加调用它的值。
var increaseBy3=makeIncreaseByFunction(3)
与(忽略变量的本地存储increaseByAmount
)完全相同:
当然,现在您可以调用
increaseBy3(10)
并获得13
increaseBy3
仅引用作为匿名函数的函数,该函数返回其第一个参数加上3
,通过调用第一个函数,您将返回一个函数。在我看来,这就像一个闭包。看吧,我明白了。正在引用您刚刚发布的链接。。。我同样的问题是。。。进一步解释“var bar=foo(2);//bar现在是闭包.bar(10);”部分的语法情况。10是如何在语法上传递到内部函数的?你所说的语法是什么意思?我认为,一旦语法被解析,任何东西都不会在语法上被传递,引擎会在完全不知道语法的情况下完成所有工作。()
是一个操作符,可以调用左边的任何函数。请尝试null()
。明白了吗+
是一个运算符,用于对左右两边的任何内容求和,然后是5+5+5
。嗯,(5+5)+5
。同样地,whater()()
是(whater())()
例如,将whater
作为函数调用,然后将其结果作为函数调用…谢谢。你能更详细地解释一下如何在var foo=makeIncreaseByFunction(3)(10)中代码>10正在进入内部函数?它只是在语法上与Javascript中通常传递给我的参数不同。你第一句话的关键词是“返回”。如果你愿意的话,这就是整个事情的转折点。。。这就是内部函数基本上在语法上取代外部函数的地方,所以我看到10是如何作为参数提供的。也许这对我来说是一种糟糕的描述方式,但我只想说我从语法上理解了它是如何结合在一起的。重要的是要理解,在一种具有一流函数的语言中,返回函数或将函数存储在变量中与处理整数或字符串没有什么不同,只是您可以稍后调用该函数。