【问题标题】:Javascript function expression use casesJavascript函数表达式用例
【发布时间】:2017-07-08 11:46:15
【问题描述】:

我最近一直在阅读javascript中的函数表达式和声明,并参考了很多关于此的在线文章。我也看到了很多关于这个话题的讨论。在学习的过程中,我给自己一个挑战,我无法清楚地解释。 我可以请 SO 专家帮助我在这里获得一些见解吗?

这是问题场景 -

场景 1:

    >var multFunc=function(n){var a=2; return n*a;}
    >multFunc(6)    
     12

我了解这种情况,结果是我所期望的 (12)。

场景 2:

>var multFunc1=function(n){return function(n){n*2}}
>multFunc1(6)
function (n){n*2}

我不明白第二种情况。为什么它不返回 12? 有人可以帮我理解吗? 我已经检查了这个链接-Javascript Function Expressions,这个链接JavaScript Nested function 昨天我也确实问了一个类似的问题,但我想我没有完全掌握这个概念(正如 T.J 亲切地解释的那样) - Trying a closure the wrong way?

【问题讨论】:

  • multFunc1 返回一个函数,因此您必须执行multFunc1()(6) 才能获得12
  • 进一步了解@4castle 所说的,注意传递给multFunc1 的参数没有被使用,并且显示的内部函数总是返回undefined(因为它没有'没有return 声明)。
  • @4castle ..调用 multFunc1()(6) 实际上返回未定义。其实我已经试过了

标签: javascript


【解决方案1】:

在第二种情况下,您实际上在这里所做的是返回函数 Object。而不是返回函数执行的结果(通常为 12),您只是返回对该对象的引用。

更新: 我认为您缺少第二个函数中的 return 语句。通过添加它,这会产生我相信您正在寻找的结果。

var multFunc1=function(n){
    return function(n){ return n*2}
}

// The first set of () require no argument as
// they are never used withing the second function. 
multFunc1()(6);

【讨论】:

  • maltFunct1()(6) 返回undefined。 (内部函数总是返回undefined。)
  • 我的错,感谢您指出这一点。我完全忽略了这一点..
  • 那么如果在第二种情况下,它是对返回函数对象的引用,我可以不从引用本身带参数调用函数吗?
  • @Shibasis Sengupta 请查看我对原始答案的更新/编辑。我认为这可能是您正在寻找的,应该更有意义。
  • @Chris 感谢您花时间发布此内容。我认为这是有道理的。我对你的回答表示赞成,但由于我的分数低(
【解决方案2】:

代码:

var multFunc1=function(n){return function(n){n*2}}

返回一个函数。所以multFunc1代表返回的函数,在这种情况下:

function(n){n*2}

所以你必须这样称呼:

multFunc1(1)(2)

所以基本上返回的函数会记住n 的值(传递的参数,我建议你阅读闭包)。所以我们可以像这样重写调用:

var multFunc1=function(n){return function(x){n*x}}
var multBy2 = multFunc1(2)
var multBy16 = multFunc1(16)

multBy2(4) // 8
multBy16(2) // 32

旁注:multFunc1 的内部函数没有任何 return 语句,因此它始终返回 undefined,正如 @nnnnnn 在 cmets 中指出的那样

【讨论】:

  • 请注意,显示的内部函数总是返回undefined
  • @Ant 感谢您的回答,但您确定这个答案吗?首先这个调用 - multFunc1(1)(2) 返回未定义。如果我这样做 - var multFunc1=function(n){return function(n){n*2}} 然后 var multBy2 = multFunc1(2);调用 multBy2(4) 返回 undefined。
  • @ShibasisSengupta:请仔细检查我的回答。您错过了 return 声明,这就是您获得 undefined 的原因
  • @Ant 感谢您的回答。我猜应该解决真正的问题,将内部函数更改为这个?返回函数(n){ 返回 n*2}。如果这就是你的意思?
猜你喜欢
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多