43、JavaScript 强制改变this指向的函数

每一个函数都有一个内置的变量this,this指向当前函数的主人,函数的主人要根据上下文关系进行判断。
【注】一般情况下this指向当前函数的主人。

常见的this(不包括特殊情况):

1.全局函数

注:一般情况下,在全局模式下声明的变量和函数,this指向都是window(除了严格模式是undefined)
 

2.对象属性

this指向的是对象
 

3.事件处理函数

this指向 绑定的事件对象
 

强制改变this指向:

一般情况下,在全局模式下声明的函数的this指向都是window
 

call

格式:函数名.call();

第一个参数:传入该函数this指向的对象,传入什么强制指向什么。

第二个参数开始,将原函数的参数顺延一位。

返回值:1.如果函数有返回值,那么返回值就是函数本身的返回值

2、 如果函数没有返回值,那么返回值时undefined;
 

apply

格式:函数名.apply();

第一个参数:传入该函数this指向的对象,传入什么强制指向什么。

第二参数:数组,数组里按顺序放入原有的所有参数

返回值:1.如果函数有返回值,那么返回值就是函数本身的返回值

2、 如果函数没有返回值,那么返回值时undefined;
 
call和apply适用于只有调用函数时,才会去改变this指向问题。当调用执行完毕以后,this指向还是之前的。

bind:预设this指向

使用方法1:

格式:函数名.bind()

第一个参数:传入该函数this指向的对象,传入什么强制指向什么。

第二个参数开始,将原函数的参数顺延一位。

返回值:更改this指向以后的函数体
 
使用方法2:

格式:函数名.bind()

一个参数:传入该函数this指向的对象,传入什么强制指向什么。

返回值:更改this指向的函数体
 
事件处理函数特殊性:
 
不能直接在show后面直接写入.call/.apply改变this指向, 因为这是立即执行函数,不是事件触发执行
 
但是可以通过函数嵌套的方法,当触发事件处理函数时,内部的改变首位处理函数才执行
 
如果直接只用bind的话,就不担心了, 因为bind本来就是预设this指向,返回的也只是更改this以后的函数
 
而call和apply执行以后的返回值依据函数是否有返回值,如果函数有返回值,那么call和apply的返回值就是函数返回值。如果函数没有返回值,那么call和apply的返回值就是undefined。
 
apply使用的小技巧

注:当不需要改变this指向,但是需要改变参数时,可以第一个参数写成null,或者’'等等。