js的this对象相关
1 var scope = 'globe' 2 function log() { 3 // console.log(this) 4 let arg = Array.prototype.join.call(arguments, ', '); 5 console.log(`${this.scope}: ${arg}`); 6 } 7 let obj = { 8 scope: 'own', 9 lop: function() { 10 let scope = 'scope'; 11 log('low') 12 } 13 } 14 obj.lop(); // globe: low 15 obj.lop.call(obj); // globe: low 16 log.call(obj, 'create') // own: create
如果把var scope= ‘globe’ 为 let scope = ‘globe’,结果就是
obj.lop(); // undefined: low
obj.lop.call(obj); // undefined: low
log.call(obj, 'create') // own: create
这里分析一下:
- log不是作为对象的方法调用的,所以this指向全局对象wondow(这里不考虑nodejs),所以obj.lop()与obj.lop.call(obj)的结果是一样的
- 使用var声明scope时,它会被挂在window上,所以使用this可以取到,但是,使用let时,文件相当于一个模块,有局部作用域,scope就不挂在window上了。
- log.call(obj, 'create')使用call绑定this值,所以this指向obj
PS: 绑定this方法: call 参数是分开的,apply 参数是数组,bind 绑定this后修改this就没有作用了。