函数的this指向 (面试必问)
* 每一个函数内部都有一个关键字 this
* 重点:函数内部的this值和函数的调用有关,和函数的定义方式没有任何关系
* 换句话说:函数内部的this指向谁,取决于函数的调用方式
function fn() {
console.log(this)
}
fn()
var obj = {
a: 1,
b: 'qwe',
c: fn
}
console.log(obj.a)
console.log(obj.c)
obj.c()
setInterval(fn, 10)
var oDiv = document.querySelector('div')
oDiv.onclick = fn
更改函数的this指向
*刚才我们说的都是函数的基本调用方式里面的this指向
*我们还有三个可以忽略函数本身的 this 指向转而指向其他地方的三个方法
- call
- 这个方法是附加在函数调用后面使用,可以忽略函数本身的this指向
- 语法:函数名.call(新的this指向,传递给函数本身的参数1,传递给函数本身的参数2,传递给函数本身的参数3...)
- apply
- 这个方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
- 语法:函数名.apply(新的this指向,[传递给函数本身的参数1,传递给函数本身的参数2,传递给函数本身的参数3...])
- bind
- 这个方法是附加在函数调用后面使用,可以忽略函数本身的this 指向
- bind和 call/apply有一点小区别,就是 bind 不会立即执行函数,而是返回一个已经改变了this 指向的函数
- 语法:var newFn = 函数名.bind(新的this指向); newFn(传递函数需要的参数)
- 面试题:
-
- 请你简单描述一下函数内部的this指向问题
-
- 如何修改函数内部 this 指向?
-
- call / apply / bind 三个方法的区别
var obj = { name: 'QF001' }
function fn(a, b) {
console.log(this)
console.log(a, b)
console.log('===============================')
}
fn(10, 20)
fn.call(obj, 100, 200)
fn.apply(obj, [1000, 2000])
var newFn = fn.bind(obj)
newFn(10000, 20000)