ES6箭头函数与普通函数的区别
ES6箭头函数与普通函数的区别
ES6箭头函数与普通函数的区别
普通函数中的this
指向函数被调用的对象,因此对于不同的调用者,this
的值是不同的。而箭头函数中并没有自己的this
(同时,箭头函数中也没有其他的局部变量,如this,argument,super等),所以箭头函数中的this
是固定的,它指向定义该函数时所在的对象。
普通函数
下面我们举一个简单的例子。
1 | var a = 3; |
上述代码中,出现了三种情况:
1 、直接通过obj调用其中的方法foo
,此时,this
就会指向调用foo函数的对象,也就是obj;
2 、将obj对象赋给一个新的对象bar,此时通过bar调用foo函数,this
的值就会指向调用者bar;
3 、将obj.foo赋给一个新对象baz,通过baz()调用foo函数,此时的this指向window;
由此我们可以得出结论:
1、普通函数的this总是指向它的直接调用者。
2、在严格模式下,没找到直接调用者,则函数中的this
是undefined
。
3、在默认模式下(非严格模式),没找到直接调用者,则函数中的this
指向window
。
再考虑一下下面的情况:
1 | var obj = { |
你可能会认为此时的输出应该为1,但是结果却是undefined
。因为此时this的指向是全局的window
对象。
通过以上例子,可以得出以下总结:
1、对于方法(即通过对象调用了该函数),普通函数中的this
总是指向它的调用者。
2、对于一般函数,this指向全局变量(非严格模式下)或者undefined
(严格模式下)。在上例中setTimeout中的function未被任何对象调用,因此它的this
指向还是window
对象。因此,这也可以总结成:javascript 的this
可以简单的认为是后期绑定,没有地方绑定的时候,默认绑定window
或undefined
。
如果我们希望可以在上例的setTimeout函数中使用this
要怎么做呢?在箭头函数出现之前,我们往往会使用以下两种方法:
1、在setTimeout函数的外部,也就是上层函数foo
内部通过将this
值赋给一个临时变量来实现。
1 | var obj = { |
2、通过bind()
来绑定this
。
1 | var obj = { |
这种现象在ES6引入箭头函数后得到了改善。
箭头函数
箭头函数是ES6中引入的新特性,使用方法为:
其中()内是要带入的参数,{}内是要执行的语句。箭头函数是函数式编程的一种体现,函数式编程将更多的关注点放在输入和输出的关系,省去了过程的一些因素,因此箭头函数中没有自己的this
,arguments
,new target(ES6)
和 super(ES6)
。箭头函数相当于匿名函数,因此不能使用new
来作为构造函数使用。
箭头函数中的this始终指向其父级作用域中的this
。换句话说,箭头函数会捕获其所在的上下文的this
值,作为自己的this
值。任何方法都改变不了其指向,如call(), bind(), apply()
。在箭头函数中调用 this
时,仅仅是简单的沿着作用域链向上寻找,找到最近的一个 this 拿来使用,它与调用时的上下文无关。我们用代码来解释一下。
1 | var obj = { |
简单分析一下代码,obj.b()中的this
会继承父级上下文中的this
值,也就是与obj有相同的this
指向,为全局变量window
。obj.c()的this
指向即为调用者obj,obj.d().()中的this
也继承自父级上下文中的this
,即d的this
指向,也就是obj。
总结
箭头函数没有自己的this
,箭头函数的this
不是调用的时候决定的,而是在定义的时候处在的对象就是它的this
。
箭头函数的this
看外层是否有函数,如果有,外层函数的this
就是内部箭头函数的this
,如果没有,则this
,是window
。
Use this card to join the candyhome and participate in a pleasant discussion together .
Welcome to aqing's candyhome,wish you a nice day .