我看过函数式编程的教程。作者介绍了这样的事情:
练习听起来像这样
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<ns1:RequestHeader soapenv:mustUnderstand="0" xmlns:ns1="https://adwords.google.com/api/adwords/cm/v201607">
<ns1:clientCustomerId>ACCOUNT_ID</ns1:clientCustomerId>
<ns1:developerToken>MY_DEV_TOKEN</ns1:developerToken>
<ns1:userAgent>MY_UA</ns1:userAgent>
<ns1:validateOnly>false</ns1:validateOnly>
<ns1:partialFailure>false</ns1:partialFailure>
</ns1:RequestHeader>
</soapenv:Header>
<soapenv:Body>
<mutate xmlns="https://adwords.google.com/api/adwords/cm/v201607">
<operations>
<operator>SET</operator>
<operand xsi:type="ns2:BiddableAdGroupCriterion" xmlns:ns2="https://adwords.google.com/api/adwords/cm/v201607">
<ns2:adGroupId>ADGROUP_ID</ns2:adGroupId>
<ns2:criterion xsi:type="ns2:ProductScope">
<ns2:dimensions xsi:type="ns2:ProductOfferId">
<ns2:value>9200000050670959</ns2:value>
</ns2:dimensions>
</ns2:criterion>
<ns2:biddingStrategyConfiguration>
<ns2:bids xsi:type="ns2:CpcBid">
<ns2:bid>
<ns2:microAmount>1</ns2:microAmount>
</ns2:bid>
</ns2:bids>
</ns2:biddingStrategyConfiguration>
</operand>
</operations>
</mutate>
</soapenv:Body>
</soapenv:Envelope>
,以便它生成一个函数,该函数仅记住传递给foo(..)
的前两个参数,并始终将它们一起添加。我出来了
foo(..)
我的解决方案有什么问题?我很困惑。
答案 0 :(得分:0)
闭包是一个可以访问外部的内部函数 (附上)函数的变量 - 范围链。关闭有三个 范围链:它可以访问自己的范围(定义变量) 在它的大括号之间),它可以访问外部函数 变量,它可以访问全局变量。
所以
function foo(x,y) {
return function() {
return x + y;
}
}
var x = foo(3,4);
这里foo函数用3&amp; 4作为参数,foo的返回值也是一个函数(closuer)。
由于所述内部函数可以访问外部作用域变量,因此foo返回的函数可以访问foo的上下文,即内部函数可以访问变量的x&amp; ÿ
所以调用x()将返回7.
答案 1 :(得分:0)
function foo(x1,y1) {
var x2 = x1, y1 = y2;
return function() {
return x2 + y2;
}
}
var x = foo(3,4);
此时x
是
function() {
return 3 + 4;
}
希望这能解释你所缺少的东西
答案 2 :(得分:0)
Jaguwalapratik已经回答了你的问题,但我认为你并不完全理解这个闭包,这就是为什么我写这个作为关闭的解释。
让我们想象一下你的解释器必须一步一步地执行这个代码:
a=foo(3,4);
好的我正在搜索foo并将3,4传递给它并将其返回值存储到x。 我为foo创建了一个新的范围,并设置了3和4。
return function(){return x+y}
好的,我把它存放在一个。 foo的执行已经完成,让我们删除x,y,因为我不再需要它们了。
a();
好的,回复x + y,但我现在不知道x和y是什么。我已经让他们死了。这就是js工程师面临的问题,他们有一个很棒的主意:关闭。
A Closure stores not only the function to a variable, but also its environment, to solve the scope loosing problem.
好的,让我们再次使用闭包:
a=foo(3,4);
哦,它返回一个函数,这不好。所以我可以放宽范围,所以我需要记住在foo中声明的所有变量和函数:
a=function(){return x+y;}
a.environment={
x:3;
y:4;
}
现在我可以删除foos范围,所有必要的数据都在闭包内。
a();
没问题! x和y在闭包内。问题解决了。
希望有所帮助:)
答案 3 :(得分:-1)
您应该添加两个参数。看起来应该是这样的。
function foo(x,y) {
return function() {
return x + y;
}
}
var x = foo(3,4);