这些写函数原型的方法是等价的吗?

Are these ways of writing function prototype equivalent?

本文关键字:方法 函数 原型      更新时间:2023-09-26

我一直习惯这样写函数原型声明:

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

但是有些开发人员这样写:

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

它们是相等的吗?如果不是,使用第二种方式的优势是什么?

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

var a = function _a() { }

var a = function () { }

前者称为命名函数表达式,

后者只是一个函数赋值。

NFE有两个优点

  • 它有一个在堆栈跟踪中显示的名称。这大大提高了调试
  • 它有一个名字,你可以在递归函数中使用

NFE有缺点。Kangax对它们进行了深入的讨论。

我个人在任何地方都使用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();

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

var x = function y() {
  y(); // here it exists
}
y(); // here it doesn't exist

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