Js的返回值问题

今天看到了网上有一篇关于js函数返回值的问题吗,里面有一些js函数的难点。在那上面提了一下,关于js函数返回另一个函数的问题,并附上了一道面试题,我就给大家分享一下

[javascript] view plain copyvar add = function(x){      var sum = 1;      var tmp = function(x){          sum = sum + x;      return tmp;      }      tmp.toString = function(){          return sum;      }      return tmp;  } // alert(add(1)(2)(3)) --> 6

登录后复制

接下来,就来详细的解读返回另一个函数的问题。

其实我是从java转过来的,一开始看到那篇文章,我对于返回另一个函数并没有什么认识,我之所以写这篇文章是因为,在那里面有一点让我感到奇怪,那就是最后的调用方式

[javascript] view plain copy

add(1)(2)(3)  

由于在java中,我没有见到过这样的函数调用方式,所以引起了我的注意,我决定去研究研究;下面就将我的研究分享出来,当然如果你对此已经有了深刻的认识,你可以选择跳过,或者对于不足的地方,给出指点微笑。好了闲话不多说,进入正题。

我们来看一个最简单的例子:

[javascript] view plain copyfunction create1(pro) {      console.log("pro : " + pro);      return function(obj1, obj2){          console.log(obj1 + " -- " + obj2);          return obj1 + obj2;      }  }

登录后复制

我构建了一个简单的函数create1,并且有一个返回值,返回值是一个内部函数。函数构建完了,接下来进行调用:

[javascript] view plain copyvar c1 = create1("pro"); // 创建函数

登录后复制

如果按照我之前的理解,当我调用了这个方法后,应该会打印出 pro : pro,接着然后报错的。如果你看完过后,也跟我有一样的想法,那恭喜你想多了或者有了固型思维微笑

。真实的是当我们通过上面的代码调用的时候,日志是打印出了  pro : pro ,但是并没有报错,并且我们反复来回的调用过后,也只是来回的打印相同的日志。这也就说明这个时候,只是进入了create1()方法,并没有进入到该函数的内部函数内。通过面试题的启发,我在试着调用了一次,发现打印出了后续的。

[java] view plain copyc1(1, 2); // 调用函数

登录后复制

这样就打印出了下面的日志;这说明其实我们一开始调用方法的时候,其实是并没有进入到里层的函数的,只是进入了外层函数体,我们只有再调用才能进入里层函数体,并且这个时候,我们重复上面的调用,他只会是调用里层的函数体,并没有外面的函数体。

类似这种函数返回另一个函数的,我们第一次调用只是构建了一个外层函数体内部函数,只有有后续的调用,才能调用内层函数体,并且重复调用,只会重复内层函数体。

不要急,还没有完,后面还有……

接下来,我们看一看另一种情况,我们先声明一个函数,用来做加法运算:

[javascript] view plain copyfunction infun(obj1, obj2) {      console.log(obj1 + " -- " + obj2);          return obj1 + obj2;  }  然后再声明一个函数,在该函数中调用上面声明的函数:[javascript] view plain copyfunction create2(pro) {      console.log("pro = " + pro);          return infun(obj1, obj2); // 这个时候,会报错  }

登录后复制

最后是调用:

[javascript] view plain copyvar c1 = create2("pro");

登录后复制

查看日志:

pro = pro‌Uncaught ReferenceError: obj1 is not defined

登录后复制

会发现,打印出了一条日志后,接着抛出了异常。对方法做一下改动,

[javascript] view plain copyfunction create2(pro) {      console.log("pro = " + pro);      var obj1 = 1, obj2 = 2;      return infun(obj1, obj2); // 这个时候,会报错  }

登录后复制

在调用会发现正常运行,并且打印出了两条日志记录。

这说明,类似于这种,在一个函数内返回一个已经声明的函数,其实是调用已经声明的函数,跟上面的情况是不一样的。

好了,现在回过头来,仔细看看开头的面试题,就会发现一切都明了了:

[javascript] view plain copy// 声明一个函数表达式  var add = function(x){      var sum = 1;      // 在函数表达式内部有一个求和的内部函数      var tmp = function(x){          sum = sum + x;// 求和          return tmp;      }      // 构建一个函数体的toString()函数      tmp.toString = function(){          return sum;      }      return tmp; // 返回的是一个函数体,如果该函数体有toString()方法,则会调用函数体的toString()方法  }

登录后复制

然后再来看看调用:

[javascript] view plain copyalert(add(1)(2)(3))

登录后复制

结果为6,至于原因就跟我们第一种讨论的情况一样,接下来,我们反复调用:

[javascript] view plain copy// 以下结果输出为:6  alert(add(10)(2)(3))  alert(add(100)(2)(3))  // 下面的结果输出变了  alert(add(1)(3)(3))  alert(add(1)(2)(5))

登录后复制

相信看了这些案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

相关阅读:

内部函数

内部函数

内部函数

以上就是Js的返回值问题的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3121308.html

(0)
上一篇 2025年3月29日 17:49:25
下一篇 2025年3月29日 17:49:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论