这些编写函数原型的方法是否相同?

时间:2011-09-21 12:04:36

标签: javascript

我一直习惯用这种方式编写函数原型声明:

var O = function () {};
O.prototype.fn = function () {}

但有些开发人员以这种方式写道:

var O = function () {};
O.prototype.fn = function fn () {}

这些方式是否相同?如果没有,使用第二种方式有什么好处?

var O = function () {};
O.prototype.fn = function fn () {}

2 个答案:

答案 0 :(得分:4)

var a = function _a() { }

vs

var a = function () { }

前者称为命名函数表达式

后者只是一个功能分配。

NFE有两个优点

  • 它的名称显示在堆栈跟踪中。这显着改善了调试
  • 它有一个名称,您可以在递归函数中使用

NFE有缺点。 Kangax talks about them in depth

我个人在任何地方使用NFE并忽略IE所造成的内存泄漏。但是,由于IE将这些函数名称泄漏到全局范围,因此应该努力使它们成为唯一的。

因为IE习惯将这些名称泄露到全球范围内,所以我试着让它们与众不同。

这就是我在_

之前添加函数声明名称的原因
var doSomeLogic = function _doSomeLogic() {

};

作为旁注,还有另一种模式

var O = function () {};
O.prototype.fn = function fn () {}

var obj = new O();

哪个是

// prototype object
var O = {
    fn: function _fn() { }
};
// factory
var o = function _o() { return Object.create(O); }

var obj = o();

答案 1 :(得分:0)

如果在创建匿名函数时使用名称,则可以在函数中使用该名称:

var x = function y() {
  y(); // here it exists
}

y(); // here it doesn't exist

对此的使用当然是有限的。您可以将它用于递归,或者将该方法作为回调函数连接。