[TOC]
this的指向问题
问题1:this的指向(背诵)
或问:解释下JavaScript中this是如何工作
第一准则: this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。
(1) 普通的函数调用
(2) 匿名函数或不处于任何对象中的函数指向window 。
(3) 如果是call, apply, bind,指定的this是谁,就是谁。
(4) 构造函数的this指向
构造函数的话,如果不用new操作符而直接调用,那即this指向window。用new操作符生成对象实例后,this就指向了新生成的对象。
(5) 箭头函数的this
由于箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值
// (1) 普通的函数调用
<script>
// 例子1
function test() {
console.log(this); // this指向window,是因为window在调用test
}
window.test();
// 例子2
var obj = {
name: '张三',
say() {
console.log(this.name); // obj.say()结果是张三 fn()调用结果是
}
}
obj.say(); // this指向obj
// 将obj.say赋给了一个新的变量
var fn = obj.say;
window.fn(); // this指向window
</script>
// (2) 匿名函数或不处于任何对象中的函数指向window 。
<script>
var obj = {
say: function() {
setTimeout(function() {
console.log(this); // this指向了window
},1000);
}
}
obj.say();
</script>
问题2:call, apply和bind的区别
- 三者都会改变this的指向, 区别:
- call 和 apply 的功能相同,区别在于传参的方式不一样:
- call的第一个参数是this要指向的对象, 第二个,第三个….都是调用函数需要的参数。
- apply第一个参数是this要指向的对象, 第二个参数是数组或类数组, 数组是放的是调用函数需要的参数。 ``` // 1. 改变this的指向
// 2.call和apply传参
2. bind 和 call/apply 有一个很重要的区别,
1. 一个函数被 call/apply 的时候,会直接调用,但是 bind 会创建一个新函数, 不会直接调用
1. 当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this, 新函数的调用和原来函数的调用一模一样,除了this的指向不一样之外
```