2011-10-30 68 views
0

编写javascript函数的下列方法是等价的。编写JavaScript函数的更好方法

也许第一个更清楚。

尽管如此,许多程序员更喜欢第二种方式。

偏好第二个方法的两种方式有显着的区别吗?

第一种方式:

Class.prototype.fn = function() { 
     var obj = { 
      … 
     }; 

     return obj; 
}; 

方式二:

Class.prototype.fn = function() { 

     return { 
      ......... 
      }; 
}; 
+1

个人而言,我不喜欢只有一次使用的变量。你为什么认为第一种方式更清楚?当你看到'return {'你知道你正在返回一个对象。 – nnnnnn

+0

@nnnnnn:那么,在调试器中单步执行代码之前,总会希望在返回结果对象之前检查它。 –

+0

@ T.J。 - 的确如此,我几乎提到过,有必要在前一天做这件事,但是我仍然发现,如果我调试了一些东西,暂时在这种情况下暂时放置一个单一用途的变量(特别是在JS通常不需要重建项目的小改动)。同一天,我发现自己正在调试别人的代码,包括一些相当长的函数,我不得不仔细检查一下哪些变量只用于在一行或两行声明和赋值中使用过一次。 – nnnnnn

回答

7

除非你需要通过字面创建后对obj执行操作时,有没有区别,它只是一种主观的风格偏好。 (请注意,所述用途可能是代码,或者在调试过程中,更多的下文。)

因此,例如,这里有一个真正实用的区别:

Class.prototype.fn = function() { 
     var obj = { 
      subordinate: { 
       foo: function() { 
        if (obj.flag) { 
         doOneThing(); 
        } 
        else { 
         doSomethingElse(); 
        } 
       } 
      } 
     }; 

     return obj; 
}; 

在那里,你所需要的名字,这样obj.subordinate.foo()作品。 (不是说我会主张这样做,但是这是一个当客观而非主观区分的例子。)但是除非在初始化之后和返回之前使用它,否则这只是一个主观的事情。

当然,这种使用不一定在代码调试时,如果您需要在返回之前检查返回的内容,则带有obj变量的表单可能更有用。


也许会有点越野滑雪在这里,但我认为它的相关:与你的问题的例子,是一个真正的,实际的,有形的这种区别:

Class.prototype.foo = function() { 
     … 
}; 
Class.prototype.bar = function() { 
     … 
}; 

这:

(function() { 
    function Class_foo() { 
      … 
    } 
    function Class_bar() { 
      … 
    } 

    Class.prototype.foo = Class_foo; 
    Class.prototype.bar = Class_bar; 
})(); 

...这不同之处在于前者的功能没有名字(属性指的是他们做的,但而不是功能本身)。在后一种情况下,functions have real names可以帮助您通过显示调用堆栈中的名称,断点列表等来帮助您。

+0

您可以分配和名称的内部函数,但: 'Class.prototype = { \t条:函数类$巴(){ \t \t \t}, \t \t富:函数类$ foo的( ){ \t \t \t} };' – Esailija

+1

@Esailija:你应该* *能,b你不能在IE8或更早的版本上(和其他JavaScript引擎在不同时间也会出现该错误的方面)。如果你尝试这样做 - 它被称为*命名函数表达式* - 在IE8或更早的版本上,它实际上创建了*两个完全不同的函数对象*并将函数名称泄漏到包含范围中(它不应该)。有关更多信息,请参阅链接文章 –

+0

我知道,在旧的IE浏览器中创建了两个函数,但由于我们在一个闭包(根据您的示例),它只泄漏到范围(而不是全局),它应该不成问题。 – Esailija