JavaScript中有关this的几种用法
在函数执行时,this 总是指向调用该函数的对象。要判断 this 的指向,其实就是判断 this 所在的函数属于谁。
1. 在一般函数方法中使用 this 指代全局对象,预编译过程指向window
var x =1 ;
function test(){
console.log(this.x)
}
test() //1
这里的输出是1,因为在函数中属于全局性的调用,因此this指代window,代表全局对象
2. 作为对象方法调用,this 指代上级对象
function test(){
console.log(this.x)
}
var obj={}//申明一个对象
obj.x = 1;//给对象设置一个属性x并赋值为1
obj.m=test;//给对象设置一个方法test
obj.m();//执行对象方法,输出的是1
以上代码相当于
var obj = {
x : 1,
m : function () {
console.log(this.x)//this指代的是obj这个对象
}
}
obj.m()
从上面代码可以看出,当this作为对象方法调用的时候,this指代的这个上级对象
3. 作为构造函数调用,this 指代new 出的对象
function Test(){ //创建一个构造函数
this.x=1 //构造函数的属性x的值为1
}
var obj = new Test();//实例化构造函数生成一个新的对象,这个对象拥有一个属性x,且值为1
console.log(obj.x) //1
在上面的代码示例中,this指代的就是obj这个新的对象
4. call/apply/bind可以改变this的指向
var obj={
name:'xxx',
getName:function(){
console.log(this.name)
}
}
var Obj2={
name:'yyy'
}
var name='zzz'
obj.getName();//xxx
obj.getName.call();//zzz 指向全局
obj.getName.call(Obj2);//yyy 指向Obj2
obj.getName.apply();//zzz 指向全局
obj.getName.apply(Obj2);//yyy 指向Obj2
obj.getName.bind(this)();//zzz 指向全局
obj.getName.bind(Obj2)();//yyy 指向Obj2
严格模式下
"use strict";
var fn=function(){
return this
}
console.log(fn()==undefined);//true
可以看出,在严格模式下,fn是被直接调用的,并没有没有被执行环境所定义,也就是说不是作为对象的属性或方法调用的(如window.fn())