参考文献: https://juejin.im/entry/5a20d18af265da43062a9031
5大规则
(1) 如果 new 关键词出现在被调用函数的前面,那么JavaScript引擎会创建一个新的对象,被调用函数中的this指向的就是这个新创建的对象。
function fn () { this.age = 10; console.log(this); } let a = new fn(); //fn {age:10}
(2) 如果通过apply、call或者bind的方式触发函数,那么函数中的this指向传入函数的第一个参数。
function hello () { console.log(this); } var obj = { value: 5 } hello.call(obj); // {value:5} hello.apply(obj); // {value:5} hello.bind(obj)(); // {value:5}
(3) 如果一个函数是某个对象的方法,并且对象使用句点符号触发函数,那么this指向的就是该函数作为"那个对象的属性"的对象,也就是,this指向句点左边的对象。
var obj = { value: 5, printThis: function() { console.log(this); } }; obj.printThis(); //{value:5, printThis:f}
(4) 如果一个函数被传给一个变量后,调用,this指向全局对象,在浏览器中,即是window。
var obj = { value: 5, printThis: function() { console.log(this); } }; let sayThis = obj.printThis; sayThis(); // window {......}
(5) 如果出现上面对条规则的累加情况,则优先级自1至4递减,this的指向按照优先级最高的规则判断。
var obj1 = { value: 'hi', print: function() { console.log(this); }, }; new obj1.print(); //print {}