this是指当前程序的运行环境,如果在函数中, 指代函数的运行环境。
一般可以分成四类
alert('Hello World!')
console.log('Hello World!')
new RegExp('\\d')
alert.call(undefined, 'Hello World')
1:全局变量默认挂载在window对象下
2:一般情况下this指向它的调用者
3:es6的箭头函数中,this指向创建者,并非调用者
4:通过call、apply、bind可以改改变this的指向
但是也有特殊情况, 相当于函数调用, this指向全局
如:
var a = 'window' var obj = { a: 'in obj' method: function(){ console.log('1', this); (function(){ console.log('2', this) })() return function(){ console.log('3', this); } } } obj.method()(); 将输出: 1, in obj, 2 window, 3 window
因为在3时,obj.method()相当于返回了函数, 是一个函数调用了, 指向全局对象。自执行函数在运行时, 也是函数调用, 指向全局作用域。
一般箭头函数指向定义时的上下文环境,一般是全局, 但是可以通过改变箭头函数的父级作用域, 间接的改变箭头函数的this.
var a = 'window' var obj = { a: 'in obj' method: function(){ console.log('1', this); return () => { console.log('3', this.a); } } } obj.method()(); // 3, in obj obj.method.call({a: 'change parent'})(); // 3, change parent obj.method().call({a: 'change arrow'}); // 3, in obj
箭头对bind, callm apply无效