遇到this,就把所有的函数调用改为call=
- 记住this是参数
- 如果是对象后面接函数,那么call后面的第一个参数是对象
如:a.sayName() => a.sayName.call(a) => this为a - 如果直接是一个函数,那么就默认为 window.fn,那么第一个参数this就是window
如:sayName() => wimdow.sayName.call(window) => this为window - JS中加不加括号都是一样的
如:(a.sayName)() 等价于 a.sayName()
因此:(a.sayName)() 中的this还是a
练习1
- 首先转换所有函数调用的代码,添加call
- 判断函数前面是对象还是window来确定this得的值
sayName.call() => window
sss.call() => window => window.name = 外
a.sayName.call => a => a.name = 里
(a.sayName).call() => a => a.name = 里
b.call() => window => window.name = 外
练习2
- 其中:arguments[0]表示传入的参数数组的第0个,也就是fn
- arguments=[fn,1]
- 转换代码为call
fn() => fn.call() => window => window.length = 10
arguments0 => arguments.fn.call => arguments => arguments.length = 2