该函数是否为递归函数?在handleMsg内部绑定onclick会引发递归问题吗?
关于handleMsg函数的递归相关问题解答
先看你提供的代码:
var state = 0; var handleMsg = function(num) { state = state + num; render( h("div", [ if ((state % 2) == 1) { h("span", "the number is odd!"), } else { h("span", "the number is even!"), } h("button", {onclick: function(){ handleMsg(1) }}, "increment"), h("button", {onclick: function(){ handleMsg(-1) }}, "decrement"), ]) ); };
问题1:给定的handleMsg函数是否属于递归函数?
答案是不属于。递归函数的核心是:函数在自身的执行流程中主动直接或间接调用自己,形成连续的调用链。但你的handleMsg函数内部并没有主动执行handleMsg(...)调用,只是在按钮的onclick回调里引用了它——这个回调只有用户手动点击按钮时才会触发,不是handleMsg本身执行时会自动调用自己,完全不符合递归函数的定义。
问题2:在handleMsg函数内部,将自身绑定到按钮的onclick事件处理函数中,是否会产生递归问题?
完全不会产生递归问题。递归问题(比如无限递归导致栈溢出)的前提是函数执行时立刻触发自身调用,形成无限循环。而这里的情况是:
- handleMsg执行时,只是把一个匿名函数赋值给按钮的
onclick属性,这个过程根本不会触发handleMsg的调用; - 只有用户点击按钮时,才会触发匿名函数里的
handleMsg(1)或handleMsg(-1),这是一个全新的独立调用,和当前正在执行的handleMsg没有嵌套调用关系,自然不会形成递归链,更不会出现无限递归的情况。
打个比方,这就像你把一把锤子放在工具箱里,只有你主动去拿它才会用,锤子自己不会跑到你手里来,所以根本不会触发递归。
内容的提问来源于stack exchange,提问作者Erik Lott
相关产品推荐
相关产品推荐

