我不完全确定说“function x(){}”或“this.x = function(){}”之间的区别,但我必须制作一个面向对象的JavaScript,其布局如下: / p>
function PROJECT(){
...
...
...
this.main_call=function(...){ return this.recursive_call(...); }
this.recursive_call=function(...){
...
var local,variables;
function helper(...,ref){
...
ref.recursive_call(...);
}
...
helper(...,this);
...
}
}
x=new PROJECT();
x.main_call(input);
我的问题是这是否是好的样式,或者是否有某种方法我可以调用辅助函数(用于停止反复复制相同的代码),而不传递“this”指针。我有点担心,因为辅助函数已经访问recursive_call中的所有局部变量,但如果我尝试直接访问this.recursive_call,则会抛出错误。在尝试声明this.helper = function(...){...}时,我也遇到了变量覆盖的问题。
答案 0 :(得分:0)
我不太明白你想要做什么,但你可以改变你的闭包。像这样的东西
function PROJECT(){
this.main_call=function(){
return recursive_call();
}
var local,variables;
function helper()
{
recursive_call();
}
function recursive_call(){
helper();
}
}
x=new PROJECT();
x.main_call(input);
如果这不符合您的需要,您可以随时将递归函数更改为此类
this.recursive_call=function(...){
...
var local,variables;
var ref = this;
function helper(...){
...
ref.recursive_call(...);
}
...
helper(...);
...
}
答案 1 :(得分:0)
从Learning Advanced JavaScript查看John Resig。
main_call
仅包装recursive_call
,则不需要。{/ li>
我个人更喜欢在助手中使用this
而不是传递ref
。
this.recursive_call=(function(){
...
function helper(...){
...
this.recursive_call(...);
}
return function(...)
...
helper.call(this,...);
...
};
}).call(this);
虽然它有点复杂,但它保持this
有用,在整个过程中我感觉更多OO。虽然你必须总是问自己需要访问哪些对象,在哪里。如果始终使用this
没有意义,则无效,请勿使用它。 Revolution42的answer就足够了。
您也可以考虑一些功能方面。例如,将帮助函数传递给recursive_call
。
答案 2 :(得分:0)
要了解function name () {}
vs var name = function () {}
,我建议您阅读以下相关问题:
/questions/336859/javascript-var-functionname-function-vs-function-functionname
答案 3 :(得分:0)
你能把它改成while / for循环吗?递归通常很难阅读和维护(这可能是您对当前代码感到不安的原因)。您仍然可以使用this.helper()调用的helper()函数,但重复该过程的决定是在循环逻辑中。