Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这些编写函数原型的方法是等效的吗?_Javascript - Fatal编程技术网

Javascript 这些编写函数原型的方法是等效的吗?

Javascript 这些编写函数原型的方法是等效的吗?,javascript,Javascript,我一直用这种方式编写函数原型声明: var O = function () {}; O.prototype.fn = function () {} var O = function () {}; O.prototype.fn = function fn () {} 但有些开发人员是这样写的: var O = function () {}; O.prototype.fn = function () {} var O = function () {}; O.prototype.fn = fun

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

var O = function () {};
O.prototype.fn = function () {}
var O = function () {};
O.prototype.fn = function fn () {}
但有些开发人员是这样写的:

var O = function () {};
O.prototype.fn = function () {}
var O = function () {};
O.prototype.fn = function fn () {}
这些方法是等价的吗?如果没有,使用第二种方法的优势是什么

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

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

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

y(); // here it doesn't exist
当然,它的用途是有限的。您可以将其用于递归,或者将该方法连接为回调函数。

var a=function\u a(){}

vs

var a=function(){}

前者称为命名函数表达式

后者只是一个函数赋值

NFE有两个优点

  • 它的名称显示在堆栈跟踪中。这大大改进了调试
  • 它有一个可以在递归函数中使用的名称
NFE有缺点


就我个人而言,我在任何地方都使用NFE,忽略IE造成的内存泄漏。然而,由于IE将这些函数名泄漏到全局范围中,因此应该努力使它们唯一

因为IE习惯于将这些名称泄漏到全局范围,所以我尝试使它们唯一

这就是为什么我在函数声明名称前加上
\uuu

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

//此处它不存在
仅在兼容浏览器中有效。IE有将
y
泄漏到全局范围的习惯“我在任何地方都使用NFE,忽略bug”,“IE有将这些名称泄漏到全局范围的习惯,我试图使它们唯一”-这是一致的逻辑吗?@katspaugh的“忽略bug”意思是我不在乎IE泄漏内存。避免NFE的主要原因是内存泄漏。如果你真的关心IE,你会编写像
var a=function\u a(){};试试{delete}catch(e){/*我讨厌IE*/}
。你说得对,我明白我的意思了。通过手工创建独特的名称来解决名称冲突与不关心内存泄漏等同。好啊