JS this指向
JS中的this指向问题,及解决方法
问题
function A() {}
A.prototype.fna = function() {
console.log(this);
}
this指向
var a = new A();
a.fna(); // A {}
var fnt = a.fna;
fnt(); // window {...}
以及
1 | function A() { |
再来一波
当this关键字在一个声明对象内部使用,其值会被绑定到调用该this的函数的最近的父对象。
1
2
3
4
5
6
7
8
9var person = {
first: 'John',
last: 'Smith',
full: function() {
console.log(this.first + ' ' + this.last);
}
};
person.full();
// 输出 'John Smith'在被声明的对象person中的full函数里面使用了this, 那么调用this的full函数的最近的父对象就是person, 因此,this指向person。
多层嵌套中依旧生效new关键字,this直接绑定到这个新对象。
call, bind, 和apply
call()第一个参数是this需要绑定的对象,剩下的是add函数本来的参数。
add.apply()也类似,除了第二个参数是一个数组.
bind()函数和call()类似,但是bind()函数不会立即被调用。bind()函数会返回一个函数,并且将this绑定好。
1 | var small = { |
想使用large.a的值,可以使用call/apply:
small.go.call(large, 2, 3, 4);
// 输出 109
现在还不知道这三个参数应该传入什么值,可以使用bind:
var bindTest = small.go.bind(large, 2);
将bindTest在控制台下打印出来,我们会看到:
console.log(bindTest);
// 输出 function (b,c,d)
该函数已经将this绑定到large对象,并且传入了第一个参数b。所以,我们接下来是需要传入余下的参数即可
bindTest(3, 4);
// 输出 109
箭头函数(->)
无法得到预期
1 | var obj = { |
箭头函数修复了this指向
1 | var obj = { |
结论
- this的值通常是由当前函数的执行环境所决定;
- 在全局作用域,this指向全局对象 (window对象);
- 当使用new关键字声明,this指向新建对象;
- 我们可以使用call(), bind(), apply()来设置this;
- 箭头函数会绑定this。