2017-09-25 68 views
1

看到箭头函数没有this,与常规函数相比,它们缺少一个非常基本的能力:它们不能用作构造函数,因为它们没有上下文。JavaScript:箭头功能是头等功能吗?

有鉴于此,arrow函数是否被认为是一流的函数?

编辑:如果箭头函数被视为第一类函数,那么箭头函数的哪些属性可以让您仍然称它为一个?

回答

1

鉴于箭头函数没有这个功能,与常规函数相比,它们缺少一个非常基本的功能:它们不能用作构造函数,因为它们没有上下文。

这只与该函数的执行有关,而不是它的类型。 A this值是执行的一个方面,而不是函数对象本身。

考虑到这一点,是否将箭头函数视为第一类对象?

是的,他们的数据对象,就像任何其他对象,具有独特的差异,它们包含了可调用可执行代码。不同类型的函数在调用方面的能力和局限性并不影响它们是否是第一类对象。

const fn = foo => foo + 42 
 
const fn2 = fn 
 

 
console.log(fn == fn2) // true 
 

 
console.log(fn(42)) 
 
console.log(fn2(42)) 
 

 
fn.foo = "bar" 
 
console.log(fn2.foo) // "bar"


编辑:如果箭头功能被认为是第一类函数,什么是箭头的功能,允许你还是叫一个属性?

与传统功能的属性相同。它们都是从Function.prototype继承的所有对象。他们的主要区别在于他们的调用,这再次不会改变他们是否是第一类对象/函数的问题。他们可以在句法上用于任何可以使用任何其他对象的地方。

+0

@Andrew:这是一个完全不同的问题,在将一个函数类型与另一个函数类型进行比较之前,必须真正问到这个问题。基本上,它们是可以像任何其他对象一样在语法上用作数据的对象。如果试图使它们成为变量,函数参数或任何其他需要值的构造的值,则解释器/编译器不会抛出语法错误。就像一个数组是一种特殊的对象值一样,一个函数也是如此。 – llama

+0

嗯..你是什么意思?“他们可以在任何地方使用任何其他物体可以使用的句法。”?因为从我如何解释这个陈述,这是不正确的,因为它们不能用作构造函数......至少不能被正确地使用。在箭头函数中,this是窗口/全局对象(或其上面的范围)。你是否认为功能改变是无关紧要的,即使它在构造函数中是不可取/错误的? – Andrew

+0

@Andrew:这不是一个语法问题;这是一个运行时问题(TypeError)。当我说“语法上”时,我的意思是解析器不会抛出一个SyntaxError,就像你试图给一个变量分配一个if语句一样。 – llama