函数对象下,强制改变this指向的三个方法
1.call
函数.call(参数1,参数2)
第一个参数位置,必定传入的是,this的指向
从第二个参数开始,是原有的参数往后顺延一位,也就是多了一个要指向的字符串,但是还是表示的原有的参数
例如:show.call(“call”,40,50); 只是强制将this指向"call",40还是赋值给num1,50还是赋值给num2
例题:
function show(num1,num2){
alert(this);
alert(num1 + "," + num2)
}
show(10,20);
//强制改变这个函数中this的指向
show.call("call",40,50);
2.apply
函数.apply
第一个参数位置,必定传入的是this指向,赋值参数的时候,直接把赋值的数放到数组中传入进去
例题:(与call传入参数的方法不同,要分清)
function show(num1,num2){
alert(this);
alert(num1 + "," + num2)
}
show(10,20);
//强制改变这个函数中this的指向
show.apply("apply",[40,50]);
【注】 前两个强制改变指向的方式是直接改变,而bind方法是先预设要改变的this指向,然后调用的时候再改变
3.bind 先预设后调用
函数.bind(this的指向);
功能:预设this的指向
返回值:还是原函数(函数中的this被预设了)
例题:
function show(num1,num2){
alert(this);
alert(num1 + "," + num2)
}
show(10,20);
//强制改变这个函数中this的指向
var res = show.bind("bind");
res(40,50);
//也可以直接写函数调用函数,注意参数的赋值,要单独在括号中
show.bind("bind1")(70, 80);
this指针
【注】只要发生函数赋值,this指向就会发生变化
this 每一个函数内部都有一个内置变量 this永远指向当前函数的主人
总结:
1.当前函数的主人是window
也就是当在全局定义一个变量的时候,this指代的就是window
调用函数的时候 window.show() = show() window可以省略,所以this指代window
function show(){
alert(this);
}
window.show();
show();*/
2.事件绑定中,this一般情况下指向当前函数的绑定的元素节点,也就是谁参与的时间绑定
例如下面,是oBtn按钮参与的点击事件,所以this指代的就是oBtn
window.onload = function(){
var oBtn = document.getElementById("btn1");
oBtn.onclick = function show(){
alert(this);
}
【注】当把函数直接赋给oBtn的时候,例:oBtn.onclick = show; 这个时候show的父级也是oBtn
3.对象中的方法;this指向当前这个对象
例如:定义obj为一个对象,里面的函数就是指代的obj
因为showName与后面的函数相等,所以showName也是个函数,showName的父级就是obj对象,所以this指代的就是obj
var obj = {
name: "小明",
sex: '男',
age: 18,
showName: function(){
alert(obj.name);
alert(this.name)
}
}
obj.showName();
4.如果没有特殊指向,setinterva和setTimeout的回调函数中this的指向都是window.
这是因为JS的定时器方法是定义在window下的。但是平时很多场景下,都需要修改this的指向。
5.箭头函数中this的指向
箭头函数中的this,不指向当前函数的主人,指向上一级函数的主人
例如:当不用指针的时候,this指代的是对象person
var person = {
name: "钢铁侠",
age: 18,
showName:function(){
alert(this); //[object Object]
alert(this.name); //钢铁侠
}
}
person.showName();
当用箭头函数时:
var person = {
name: "钢铁侠",
age: 18,
showName:() => {
alert(this); //object Window 解析:箭头函数中的this,不指向当前函数的主人,指向上一级函数的主人
//alert(this.name); //空字符串,因为window里没有name变量
}
}
person.showName();