this 的四种调用方式
一、方法调用模式
当一个函数被保存为对象的一个属性并调用该方法时,this被绑定至该对象。即使用”obj.method”形式
1 | var val = 'outer' |
二、构造器调用模式
类似面向对象语言中**对象**的概念,使用new后,this被绑定至该实例。
1 | var val = 'outer' |
三、函数调用模式
函数未作为对象的属性时,其当作一个正常函数来调用,此时this被绑定至全局对象。
注意:在严格模式下,此时的 this 为 undefined
1 | var val = 'outer' |
1 | var obj = { |
包括匿名函数/自执行函数:
1 | var obj = { |
四、apply/call/bind
手动指向this的值
1 | var val = 'outer' |
1.apply Function.prototype.apply()
fun.apply(thisArg[, argsArray])
thisArg:在 fun 函数运行时指定的
this
`值。argsArray:一个数组或者类数组对象,其中的数组元素将作为单独的参数传给
fun
函数。
1 | var val = 'outer' |
2.call Function.prototype.call()
fun.call(thisArg[, arg1[, arg2[, …]]])
thisArg: 在fun函数运行时指定的
this
值。
arg1, arg2, ...
指定的参数列表。
1 | var val = 'outer' |
3.bind Function.prototype.bind()
fun.bind(thisArg[, arg1[, arg2[, …]]])
thisArg
当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用
new
操作符 调用绑定函数时,该参数无效。
arg1, arg2, ...
当绑定函数被调用时,这些参数将置于实参之前传递给被绑定的方法。
1 | var val = 'outer' |
this 的应用
一、js 的链式方法
实现 fn.set(number).get() 输出为 number
1 | function obj() { |
二、柯里化
实现 add(1)(2)() = 3 add(1, 2, 3,4)() = 10
原理: 将所有参数都丢到一起后相加
1 | function add() { |
arguments:arguments 是一个类似数组的对象, 对应于传递给函数的参数。[].slice.call(arguments) 将类数组对象转为数组。
1 | 朋神优雅的写法 |
参考: