JavaScript在函数中this指向不是定义的时候确定的,而是真正运行此函数时确定的。要想判断函数中this的指向,只要知道谁直接调用产生this指针的函数,this就指向谁了。只是要注意使用了new 操作符之后,构造函数内部的this指向的是新对象,通俗点讲就是new出来的新实例。
一、 this指向的形式
1.1 纯粹的函数调用
函数的最通常用法,属于全局性调用,this指向全局对象window
var temp = 1;
function test1() {
console.log(this.temp);
}
test1(); // 1
1.2在严格模式下”use strict”,为undefined
"use strict";
var temp = 1;
function test2() {
console.log(this.temp);
}
test2(); // undefined
1.3对象的方法里调用,this指向调用该方法的对象
function test3() {
console.log(this.temp);
}
var obj = {};
obj.temp = 1;
obj.x = test3;
obj.x(); // 1
1.4 构造函数里的this,指向创建出来的实例
通过构造函数,可以生成一个新对象。this就指这个新对象。
function test4() {
this.x = 1;
}
var obj = new test4();
obj.x // 1
二、 改变this指向的方式
2.1 call()函数
例: 被调函数名.call(param1,param2,param3);
定义:call()是函数的一个方法,作用是改变函数的调用对象。
第一个参数就表示改变后的调用这个函数的对象。第二个参数开始都是函数实际参数
因此,这时this指的就是这第一个参数。
(function() {
alert(this);
}).call("js is amazing");
2.2 apply()函数:
例: 被调函数名.apply(param1, param2);
定义:apply()是函数的一个方法,作用是改变函数的调用对象。
第一个参数就表示改变后的调用这个函数的对象。第二个参数是一个集合
因此,这时this指的就是这第一个参数。
var x = 0;
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.temp = test;
obj.temp.apply() // 0
//obj.temp.apply(obj); //1
apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果调用最后一行代码,运行结果就变成了1,证明了这时this代表的是对象obj
2.3 bind()函数
例:.bind() bind(thisScope, arg1, arg2…)
定义:bind()方法会创建一个新的函数,称为绑定函数,方法在this环境下调用。该方法可传入两个参数
第一个参数作为this,第二个及以后的参数则作为函数的参数调用
var name = "Linus";
var person = {
name:"geekfanr",
age:22,
say:function(){
alert(this.name);
setTimeout(function(){
alert(this.name);
}.bind(this),1000);
}
}
person.say();//geekfanr twice
bind改变this指向后,返回的是函数