返回函数以在JavaScript中创建闭包

时间:2016-09-15 09:09:26

标签: javascript

我看过函数式编程的教程。作者介绍了这样的事情:

enter image description here

练习听起来像这样

  1. 定义<?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(..)的前两个参数,并始终将它们一起添加。
  2. 我出来了

    foo(..)

    我的解决方案有什么问题?我很困惑。

4 个答案:

答案 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);