this应该是常见面试题,本想着总结下,发现以下链接全面详细的解释了该知识点
- 普通函数调用,此时 this 指向 window
- 构造函数调用, 此时 this 指向 实例对象
- 对象方法调用, 此时 this 指向 该方法所属的对象
- 通过事件绑定的方法, 此时 this 指向 绑定事件的对象
- 匿名函数、定时器函数, 此时 this 指向 window
- call,apply,bind指的this 是谁就是谁。当第一个参数是null或者undefined时,this指向window。
https://www.cnblogs.com/hjson/archive/2019/01/11/10254555.html
apply call bind的区别
apply()第一个参数是this指向的对象,第二个参数是函数执行时要传入的参数 ,必须是一个数组
Function.apply(obj[,argArray])
- 它的调用者必须是函数 Function,并且只接收两个参数,第一个参数的规则与 call 一致。
- 第二个参数,必须是数组或者类数组,它们会被转换成类数组,传入 Function 中,并且会被映射到 Function 对应的参数上。这也是 call 和 apply 之间,很重要的一个区别。
call()第一个参数是this指向的对象,第二个参数是函数执行时要传入的参数
Function.call(obj,[param1[,param2[,…[,paramN]]]])
- 调用 call 的对象,必须是个函数 Function。
- call 的第一个参数,是一个对象。 Function 的调用者,将会指向这个对象。如果不传,则默认为全局对象 window。
- 第二个参数开始,可以接收任意个参数。每个参数会映射到相应位置的 Function 的参数上。但是如果将所有的参数作为数组传入,它们会作为一个整体映射到 Function 对应的第一个参数上,之后参数都为空。
bind()第一个参数是this指向的对象,第二个参数是函数执行时要传入的参数
区别:
call、apply能够改变函数执行时的上下文,将一个对象的方法交给另一个对象来执行,并且是立即执行。区别参数不同。
bind是返回一个函数,而不是像call、apply立即调用,需要稍后调用才会执行
总结:
call 和 apply 的主要作用,是改变对象的执行上下文,并且是立即执行的。它们在参数上的写法略有区别。
bind 也能改变对象的执行上下文,它与 call 和 apply 不同的是,返回值是一个函数,并且需要稍后再调用一下,才会执行。
上次自测this知识点有涉及作用域,还需注意立即执行函数this指向的是window
var a = 1;
console.log(a); //1 a在全局作用域
function fire() {
var a = 2;
console.log(a); // 2 fire函数作用域
function innerFire() {
var a = 3;
console.log(a); //3 此时打印输出a,a在innerFIre作用域。从自身作用域查找变量,未找到才网上查找
}
innerFire();
}
fire()