1.函数预编译过程 this指向window
举例:
<script>
function test(c){
var a=123;
function b(){}
console.log(this);
}
test(1);
</script>
函数预编译时,会生成一个AO对象(Activation Object活动对象/执行期上下文)
AO{
//变量声明提升
a:undefined,
//形参以及赋值
c:1,
//函数声明提升并赋值
b:function(){}
}
但实际上AO对象中不止存储了这些,AO中还有实参列表arguments[]和this(这里的this指向window)
AO{
//变量声明提升
a:undefined,
//形参以及赋值
c:1,
//函数声明提升并赋值
b:function(){},
arguments:[1],
this:window
}
在test函数中输出的this 和window相同
如果把test当作构造函数来创建对象,this将不再指向window,而是会在系统内部隐式的生成this指向创建出来的对象
var this = Object.create(test.prototype);
2.全局作用域里this指向window
在控制台直接打印this,会输出全局作用域里的this
3.call/apply方法可以改变函数运行时this指向
4.obj.func(); func()里面的this指向obj
哪个对象调用的方法,这个方法中的this就指向哪个对象
var obj = {
a:function(){
console.log(this.name)
},
name:'abc'
}
obj.a();
对象obj调用的方法a,则a方法中的this就指向obj对象,会输出obj对象的name属性
如果没有用对象调用方法,则方法里的this指向window
var foo = '123';
function print(){
var foo = '456';
this.foo = '789';
console.log(foo);
}
print();