学习箭头函数的过程中遇到了问题 解决之后记录一下
参考资料:阮一峰 es6标准入门
箭头函数
箭头函数是一种写作方式十分简洁高效的函数 但对比其他函数有几点不同,比如箭头函数不能用作构造函数.
这恰恰是因为箭头函数的this指向问题,实际上箭头函数是没有this指针的,所以不能用作构造函数.在调用箭头函数的this时,导致内部的this就是外层代码块的this. (还有一点尤为重要 就是箭头函数的this指向是不可变的)
所以说箭头函数体内的this对象就是定义时所在的对象,而不是使用时所在的对象
验证程序
下面是我在学习过程中用作验证的程序
程序1:
①可以看到test为箭头函数 test2为普通函数 其外部代码块都为函数foo
根据上面所说 此时test的this即为foo的this 而因为函数提升 foo的this指向全局 所以直接执行foo函数 test函数打印为全局的变量id=21,而test2函数因为函数提升this也指向全局打印21
②使用call改变foo的this指向 此时test的this指向call传入的{id:0},打印0.test2仍然指向全局打印21.
③写出这个函数之后的思考中 一直想不明白为什么直接执行foo函数的话 test函数不打印0 其实是因为混淆了执行上下文和this对象 foo函数中的var id = 0 对本文理解this 对象没有作用
程序2:
当外部代码块为对象foo时,test此时this对象为全局(foo的this)
执行foo.test()和foo.test2时的实际步骤为test.call(foo),test2.call(foo)
但因为箭头函数this指针不允许被改变,所以test打印21,test2打印0
后半部分单独把函数体赋值给test3 和采用立即执行函数 均是为了验证foo.test2()的执行过程.
前端小白 欢迎提问与指正~