js------this关键字
在js中this可以是全局对象、当前对象或者其他对象,在一段代码中this指的是什么? ——看函数的调用方式,谁调用了它就指的是谁
函数的调用方式:一般函数、对象方法、构造函数、绑定(apply/call/bind)、
1.一般函数:
x=1; function test(){ this.x=2; } test(); console.log(x);//2
函数为此时this指为全局对象
2.对象方法:
var a="mm"; var test={ a:"nn", fn:function(){ console.log(this.a); } } test.fn();//nn
此时的this指向调用的对象test
这里有一点是,分清调用的对象,下面这个tt()调用时调用的是全局对象:
function fn() { console.log( this.a ); } var obj = { a: 2, fn: fn };
obj.fn();//2 var tt = obj.fn; a = "3"; tt(); //3
3.构造函数:
function Test(){ this.a="hi "; this.fn = function(str){ console.log(this.a+str) } } var test = new Test(); test.fn("sun");//hi sun
test是构造函数Test的一个实例,通过this,可以使构造函数的实例访问到其构造函数的属性或者方法(类似为公共的)
4.apply\call\bind 是改变函数的调用对象
apply方法的第一个参数为改变后调用这个函数的对象,this指代第一个参数,如果为空,则表示全局,第二个参数必须是一个数组
call方法与apply相似,但第二个参数是不同的,可以添加多个参数
bind方法第一个参数为调用的对象,返回的是一个修改过后的函数,可以添加多个参数。
var a = { name:"mery", fn:function(){ console.log(this.name); } } name="sun"; var b = a.fn; b.apply(a);//mery b.apply();//sun 因为第一个对象为空,默认全局变量 b.call();//sun 因为第一个对象为空,默认全局变量 b.bind(a);//没有任何值 b.bind(a)();//mery b.bind()();//sun