this指向
this在什么情况下指向window?
1. 纯粹的函数调用
- 函数常用发,属于全局性调用。因此函数内的
this
指向window。请看下面这段代码,它的运行结果是1
。
var num = 1;
function fun(){
console.log(this.num)
}
fun() // 1
this在什么情况下指向调用者?
1. 对象方法的调用
- 函数可以作为某个对象的方法调用,这时候的
this
指向上级对象
function test(){
console.log(this)
}
var obj = {
x:666;
fn:test
}
obj.fn // {x:666,fn:f test()}
2. 构造函数的调用
- 所谓的构造函数,就是通过这个函数,通过new的生成一个新对象,这时候的
this
指向新对象
function Test(){
this.x = 999;
}
var obj = new Test()
obj.x // 99
- 运行结果为
99
。为了表明这时候的this
不是全局,请看下面案例。
var x = 2;
function Test(){
this.x=777;
}
var obj = new Test()
console.log(x) // 2
console.log(obj.x) // 777
- 运行结果全局定义的
x
为2
,并没有被obj
new出来的Test对象修改的x值改变。也就是说obj
new出来的Test指向的是上级对象,并非指向window
通过 apply(),call() 调用改变this指向
- 这里是通过apply去改变this指向。call的方式也是类似。不同点的是apply只能有两个参数,apply(this,[]),而call可以有多个参数call(this,1,2,3,4,5)
var x = 0;
function test(){
console.log(this.x)
}
var obj = {
x:1,
fn:test
}
obj.fn.apply() // 0
apply()
有2个参数,当参数为空时,默认调用全局对象。因此这时候的运行结果为0
。这时候的this
指向全局- 通过改变
apply
的参数修改this
指向,把最后一行代码修改为下面的
obj.fn.apply(obj) //1
运行结果变成1
,说明这时候的this
指向上一级obj
对象