【问题标题】:Javascript function organizationJavascript函数组织
【发布时间】:2011-01-16 23:23:32
【问题描述】:

我不确定“function x(){}”或“this.x=function(){}”之间的区别,但我必须制作一个面向对象的 JavaScript,其布局如下:

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(...){...} 时,我还遇到了变量覆盖的问题。

【问题讨论】:

    标签: javascript oop function


    【解决方案1】:

    你能把它改成一个while/for循环吗?递归通常难以阅读和维护(这可能是您对当前代码感到不安的原因)。你仍然可以有一个由 this.helper() 调用的 helper() 函数,但重复该过程的决定是在循环逻辑中。

    【讨论】:

      【解决方案2】:

      要了解function name () {} vs var name = function () {},我建议阅读这个相关问题:

      /questions/336859/javascript-var-functionname-function-vs-function-functionname

      【讨论】:

        【解决方案3】:

        John Resig 签出Learning Advanced JavaScript

        1. 如果main_call 只包装recursive_call,则不需要。
        2. 对于辅助函数,请考虑在创建函数时使用函数闭包,以免每次调用都创建它们。
        3. 我个人更喜欢在帮助程序中使用this 而不是传递ref

          this.recursive_call=(function(){
            ...
            function helper(...){
              ...
              this.recursive_call(...);
            }
            return function(...)
               ... 
               helper.call(this,...);
               ...
            };
          }).call(this);
          

        虽然它有点复杂,但它使this 始终有用,这对我来说感觉更OO。尽管您必须始终问自己需要访问哪些对象,在哪里访问。如果始终使用this 没有意义,那么它没有用,请不要使用它。 Revolution42answer 就足够了。

        您还可以考虑一些功能方面。例如,将帮助函数传递给recursive_call

        【讨论】:

          【解决方案4】:

          我不太明白你想做什么,但你可以改变你的闭包。像这样的

          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(...);
              ...
            }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-30
            • 1970-01-01
            • 1970-01-01
            • 2017-08-14
            • 2019-07-31
            相关资源
            最近更新 更多