1.函数内部的this指向:
this对象依赖于上下文,大多数情况下this对象取决于谁调用了此函数。
- 在方法中,this 指的是所有者对象;
var person = {
name:"Tom";
outName:function(){
return this.name; //Tom
}
}
- 在单独情况下,this 指的是全局对象;
var x=this; //Window
- 在函数中,this 指的是全局对象;
function myFunction(){
return this; //Window
}
- 在函数中,严格模式下,this 是undefined;
"use strict";
function myFunction(){
return this; //undefined
}
- 在事件中,this 指的是接收事件的元素。
<button onclick="this.style.display='none'">单击来删除我!</button> //当点击这个按钮时,按钮会消失
2.改变函数内部this指向
call()方法:
call()改变this指向:
call()方法调用一个对象。可以简单理解为调用函数的方式,但是它可以改变函数的 this 指向
应用场景:经常做继承;
//call可以调用函数
//call可以改变函数内部的this指向
//使用call方法传递参数使用逗号隔开
//call方法一般应用于继承
var person = {
name:"Tom"
};
function outName(a, b) {
console.log("call()");
console.log(this);
console.log(a+b) };
outName(1,2); // 此时的this指向的是window 运行结果为3
outName.call(person,1,2); //此时的this指向的是对象person,参数使用逗号隔开,运行结果为3
apply()方法:
apply() 方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。
应用场景: 经常跟数组有关系。
//apply可以调用函数
//apply可以改变函数内部的this指向
//使用apply方法传递参数使用数组传递
//apply方法一般应用于操作数组数据
var person = {
name:"Tom"
};
function outName(a,b) {
console.log("apply()");
console.log(this);
console.log(a+b);
};
outName(1,2); // 此时的this指向的是window 运行结果为3
outName.apply(person,[1,2]); //此时的this指向的是对象person,参数使用数组传递 运行结果为3
bind()方法:
bind() 方法不会调用函数,但是能改变函数内部this 指向,返回的是原函数改变this之后产生的新函数;
如果只是想改变 this 指向,并且不想调用这个函数的时候,可以使用bind;
应用场景:不调用函数,但是还想改变this指向。
//bind不会调用原来的函数 可以改变原来函数内部的this 指向
//返回的是原函数改变this之后产生的新函数
//应用场景:如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind
var person = {
name:"Tom"
};
function outName(a,b) {
console.log("bind");
console.log(this);
console.log(a+b);
};
var out = outName.bind(person,1,2); //此处的 out 是bind返回的新函数
out(); //调用新函数 this指向的是对象person 参数使用逗号隔开
call() apply() bind()三者的异同:
相同点:都可以改变this的指向;
不同点:
- call和apply都会调用函数,并改变函数内部this指向;
- call传递参数使用逗号隔开传递,apply传递参数使用数组传递;
- bind 不会调用函数。