JavaScript中匿名方法的优缺点是什么?

5

在JavaScript中,有许多不同的方法来设置某些内容的方法,例如按钮点击事件。

例如,假设您已经获取了一个输入元素'button'

function MyForm(){
   //anonymous method
   button.click = function(){ //work };


   //private method
   var handleClick = function () { // work };
   button.click = handleClick;

   //public method
   button.click = outerClickHandle;


}

//public
function outerClickHandle(){
    // work
}

//prototype
MyForm.prototype.outerClickProto(){
   //work
}

当然有一些更明显的答案,例如在需要时使用封装。并且使用原型,您无需每次重新创建该函数,这对性能很有好处。但是关于匿名方法,除了作为编写脚本的一种不错方式或者流程外,有什么好坏之分呢?

1个回答

4
我发现的主要优点是,由于它是内联声明的,匿名函数可以访问范围内的所有当前局部变量,在某些情况下可以极大地简化代码。一个经典的例子是在setTimeout()中使用在上面定义的变量。
当然,匿名函数还不会干扰你所在的任何命名空间(全局、函数内部等...)因为它不需要名称。
使用addEventListener(type, fn)事件处理程序的匿名函数的缺点是,您无法删除仅该事件侦听器,因为您没有函数句柄。
匿名函数的另一个缺点是,每次运行使用它的代码时都会创建一个新函数,在某些情况下根本没有任何区别,但在其他情况下,出于性能原因可能需要考虑这一点(例如,如果在循环中执行操作)。

关于命名空间的这个观点非常好,我会记在心里并在以后的工作中应用。 - tam
1
匿名函数的另一个缺点是每次运行使用它的代码时都会创建一个新函数,在某些情况下根本没有任何区别,但在其他情况下可能需要考虑性能问题(例如,在循环中执行操作时)。 - nnnnnn
2
我建议编辑上述答案以包括nnnnnn的评论,因为函数和相关闭包消耗的内存可能会变得很大。匿名和私有方法模式每个对象各一个和一个共享执行环境(闭包)。公共方法不创建函数对象,而是使用为公共函数创建的函数对象。如果您调用MyForm一次,您将看不到差异,但如果您调用它10,000次,那么肯定会有所不同。 - chuckj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接