Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.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_Class_Lambda_Arrow Functions - Fatal编程技术网

在javascript类中混合使用箭头函数有什么缺点吗?

在javascript类中混合使用箭头函数有什么缺点吗?,javascript,class,lambda,arrow-functions,Javascript,Class,Lambda,Arrow Functions,如果您不熟悉,EMCA6草案将添加。主要区别在于: Arrow函数具有此功能(因此无需调用或创建闭包) 较短的语法()=>“foo”vsfunction(){return“foo”} 箭头函数缺少.prototype。因此,它们不能用作构造函数,不能用new调用,并且是轻量级的 话虽如此,让我们看一看下面的小例子: var Animal = function(sound) { this.sound = sound; //arrow notation has lexical t

如果您不熟悉,EMCA6草案将添加。主要区别在于:

  • Arrow函数具有此功能(因此无需调用或创建闭包)
  • 较短的语法
    ()=>“foo”
    vs
    function(){return“foo”}
  • 箭头函数缺少.prototype。因此,它们不能用作构造函数,不能用new调用,并且是轻量级的
话虽如此,让我们看一看下面的小例子:

var Animal = function(sound) {
    this.sound = sound;
    //arrow notation has lexical this, so this makeNoise must be defined in the constructor
    Animal.prototype.makeNoise = () => this.sound;
};

let dog = new Animal("woof!");
dog.makeNoise(); //woof!
在这里,我创建了一个简单的类,它恰好使用了arrow函数作为它的方法之一,而不是普通函数。我知道这是在每次初始化动物时设置
Animal.prototype.makeNoise
,但与正常设置相比,上述设置是否还有其他缺点:

var Animal = function(sound) {
    this.sound = sound;
};
Animal.prototype.makeNoise = function() { return this.sound; };

let dog = new Animal("woof!");
dog.makeNoise(); //woof!

我很好奇这样做是否有任何潜在的危险,因为我确信人们会在任何他们可以逃脱惩罚的地方使用新的缩写语法。提前感谢。

我建议不要这样做,部分原因是Pointy在评论中给出的:您正在为每个Animal实例创建一个新的arrow函数对象,这对性能和内存管理都不利。这实际上比复制函数对象更糟糕:因为它还围绕该函数创建了一个新的闭包,所以只要动物对象仍在内存中,垃圾收集器就无法释放构造函数的任何局部变量

但另一个原因是ECMAScript 6还引入了一种更好的语法来实现这一目的:

class Animal {
   constructor(sound) {
       this.sound = sound;
   }
   makeNoise() {
       return this.sound;
   }
}

我建议不要这样做,部分原因是波蒂在他的评论中给出的:你正在为动物的每个实例创建一个新的arrow函数对象,这对性能和内存管理都是有害的。这实际上比复制函数对象更糟糕:因为它还围绕该函数创建了一个新的闭包,所以只要动物对象仍在内存中,垃圾收集器就无法释放构造函数的任何局部变量

但另一个原因是ECMAScript 6还引入了一种更好的语法来实现这一目的:

class Animal {
   constructor(sound) {
       this.sound = sound;
   }
   makeNoise() {
       return this.sound;
   }
}

每个实例化都有一个新的函数对象。
functionanimal(name,sound){..()=>name+“说“+this.sound}
。。由于在构造函数中分配了原型,因此可能会出现意外混合的问题。@user2246674您是对的,在构造函数中声明函数也会创建另一个闭包,以便您可以访问传入的任何参数或在动物构造函数中创建的变量。每个实例化都有一个新的函数对象。
function Animal(name,sound){..()=>name+“表示“+this.sound}
。。由于在构造函数中分配了原型,因此可能会出现意外混合的问题。@user2246674您是对的,在构造函数中声明函数也会创建另一个闭包,以便您可以访问传入的任何参数或在动物构造函数中创建的变量。谢谢您的警告。我知道总的来说这是一个坏主意,但我想知道是否还有其他特别糟糕的事情。很高兴知道,新的类语法将其纳入了EMCA6草稿,出于某种原因,我认为它仍在被提出。我编辑了评论,其中提到了使用闭包函数的另一个不良后果:它阻止了构造函数局部变量的垃圾收集。感谢您的警告。我知道总的来说这是一个坏主意,但我想知道是否还有其他特别糟糕的事情。知道新的类语法将其编入EMCA6草稿也很好,出于某种原因,我认为它仍在被提出。我编辑了评论,其中提到了使用闭包函数的另一个不良后果:它阻止了构造函数局部变量的垃圾收集。