JavaScript中的this
解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的
上下文对象
,根据函数的调用方式的不同,this会指向不同的对象
- 以函数的形式调用时,this永远都是window
- 以方法的形式调用时,this就是调用方法的那个对象
- 以构造函数的形式调用时,this就是新创建的对象
- 使用call和apply调用时,this是指定的那个对象
// 定义一个函数
function fun(){
console.log(this.name);
}
//创建一个对象
var obj = {
name:"孙悟空",
sayName:fun
};
var obj2 = {
name:"沙和尚",
sayName:fun
};
var name = "全局的name属性";
//以函数形式调用,this是window
fun();
//以方法的形式调用,this是调用方法的对象
obj.sayName();
obj2.sayName();
在函数默认使用的时候,它属于的是windons下的一个函数,因此this就是windons而如果采用对象调用的时候,那么this就是对象
apply和call
通过apply和call可以改变this的指向
apply和call的使用方法
apply的使用语法
- 函数名字.apply(对象,[参数1,参数2,…]);
- 方法名字.apply(对象,[参数1,参数2,…]);
call的使用语法
函数名字.call(对象,参数1,参数2,…);
方法名字.call(对象,参数1,参数2,…);
其作用都是改变this的指向,不同的地方就是参数传递的方式是不一样的
只要是想使用别的对象的方法,并且希望这个方法是当前对象的,那么就可以使用apply或者是call的方法改变this的指向
方法一:
function f1(x, y) { |
本来f1函数是window对象的,但是传入obj之后,f1函数此时就是obj对象的
方法二:
function Person(age, sex) { |
apply和call方法实际上并不在函数这个实例对象中,而是在Function的prototype中
bind
bind方法是复制的意思,参数可以在复制的时候传进去,也可以在复制之后调用的时候传入进去
与apply和cal不同的是:
- apply和call是调用的时候改变this指向
- bind方法,是赋值一份的时候,改变了this的指向
使用的语法:
函数名字.bind(对象,参数1,参数2,...);
——>返回值是复制之后的这个函数方法名字.bind(对象,参数1,参数2,...);
——>返回值是复制之后的这个方法
方法一:
function f1(x, y) { |
方法二:
function Person(age) { |
bind的案例使用
//通过对象,调用方法,产生随机数 |
通过在window.setInterval
中使用bind()
改变this的指向,从而调用了show2
函数