这些this的指向,是当我们调用函彭赂时候确定的。调用方式的不同决定了this的指向不同一般指向我们的调用者
调用方式 | this指向 |
普通函数调用 | window |
构造函数调用 | 实例对象原型对象里面的方法也指向实例对象 |
对象方法调用 | 该方法所连对象 |
事件绑定方法 | 绑定事件对象 |
定时器函数 | window |
立即执行函数 | window |
1.普通函数 this 指向window
function fn(){
console.log(this);
}
fn();//window
2.对象的方法 this指向的是对象o
var o={
sayHi:function (){
console.log(this);
}
}
o.sayHi();
3.构造函数 this 指向ldh这个实例对象 原型对象里面的this也是指向ldh这个实例对象
function Star(){};
var ldh= new Star();
4.绑定事件函数 this指向的是函数的调用者 btn这个按钮对象
btn.onclick=function(){} //点击这个按钮就可以调用
5.定时器函数 this指向window
window.setInterval(function(){},1000) 这个函数是定时器函数自动1秒钟调用一次
6.立即执行函数 this指向window
(function(){
console.log(123);
})();
// 立即执行函数自动调用
一.改变函数内部this 指向
JavaScript 为我们专门提供了一些函数方法来帮我们更优雅的处理函数内部this的指向问题,常用的有 bind(),call(), apply()三种方法。
1.call 方法
call方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的this指向。
fun.call(thisArg,argi,arg2,...)
fun:函数
thisArg :在fun函数运行时指定的this值
arg1,arg2:表示参数
var o={
name:"andy"
}
function fn(a,b){
console.log(this);
console.log(a+b);
}
fn.call(o,1,2);//这里输出的this指向o
call 可以调用函数 可以改变函数内的this指向
call的主要作用可以实现继承
2.apply方法
apply(方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的this指向。
fun. apply(thisArg,[argsArray])
thisArg :在fun函数运行时指定的this值
argsArray :传递的值,必须包含在数组里面
返回值就是函数的返回值,因为它就是调用函数
var o={
name:"andy"
}
function fn(){
console.log(this);
console.log(arr);//"pink"
}
fn.apply(o,["pink"]);
1.调用函数 可以改变函数的内部指向
2.但是他的参数必须是数组(伪数组)
3.apply 的主要应用 比如我们可以利用apply 借助于数学对象求最大值
var arr=[1,66,3,99,4];
var max=Math.max.apply(Math,arr);
console.log(max);
3.bind方法
bind0方法不会调用函数。但是能改变函数内部this指向
fun. bind (thisArg,arg1, arg2, -.-)
thisArg :在fun 函数运行时指定的this值
arg1 , arg2∶传递的其他参数
返回由指定的this值和初始化参数改造的原函数拷贝
var o={
name:"andy"
}
function fn(){
console.log(this);
};
var f=fn.bind(o);
1.不会调用原来的函数 可以改变原来函数内部的this指向
2.返回的是原函数改变this之后产生的新函数
blind方法应用
var o={
name:"andy"
}
function fn(){
console.log(this);
};
var f=fn.bind(o);
f();
1.不会调用原来的函数 可以改变原来函数内部的this指向
2.返回的是原函数改变this之后产生的新函数
3.如果有的函数我们不需要调用,但是又想改变函数内部的this指向 此时用bind
4.我们有一个按钮,当我们点击了之后,就禁用这个按钮,3秒钟之后开启这个按钮
var btn=document.querySelector("button");
btn.onclick=function(){
this.disabled=true;
setTimeout(function(){
this.disabled=false;//此时定时器里面的this指向btn
}.bind(this),3000)//这个this指向的是btn这个对象
}