谁调用this就指向谁!当没有明确调用对象时。this指向window!
先记住一个事,window是对象,是被实例化的对象,实例化过程是在页面加载的时候由JavaScript引擎完成的;
在JavaScript里直接使用this,this执行指向window;
函数声明会在全局作用域构造的时候完成,所以函数声明是window对象的属性,所以不管在哪里声明函数,声明函数最终都是属于window对象,声明函数里的this是指向window的;
函数表达式的this也指向window,当他被写在另一个函数里面也是这样;
其实,在JavaScript里面,任何匿名函数都是属于window对象,他们也是在全局作用域构造的时候完成定义和赋值,在定义匿名函数的时候它会返回自己的内存地址;
this都是指向实例化对象;
如果要把this从window变成其他对象,那么就得让function被实例化--使用new操作符;
使用了new操作符实例化的对象的this指向的是Object实例;
通过字面量方式定义对象的方式是new Object的简写,二者是等价的,所以里面的this也是指向Object实例的;
call和apply将this指针指向方法的第一个参数,如果没有参数的话,指向window;
bind也可以改变this的指向;
(这三个的区别:apply、call、bind的区别)
如果给定义对象里面传入了函数:
传入的参数是函数的别名,那么函数的this就指向window;
传入的参数是被new过的构造函数,那么this 就指向实例化的对象本身;
如果想把被传入的函数对象里this的指针指向外部字面量定义的对象,那么就是用apply和call;
总结:在javascript 语言里没有通过new(包括对象字面量定义)、call和apply改变函数的this指针,函数的this指针都是指向window的;
例子:
var b = function() {
console.log(this);
return function() {
console.log(this);
}
}
var c = b(); // ?window,函数表达式里的this指向window
c(); // ? window,c现在等于function() { console.log(this); }
var a = {
fn : c
}
a.fn(); // ? Object,c在一个字面量里面,字面量创建的对象也相当于new了一次,所以
//this指向一个实例对象
var e = {
fn : function() {
c();
}
}
e.fn(); // ? window 这是一个匿名函数,this指向window,这里相当于
//var e = {
// fn : function() {
// function() {
// console.log(this);
// }
// }
console.log(this);
return function() {
console.log(this);
}
}
var c = b(); // ?window,函数表达式里的this指向window
c(); // ? window,c现在等于function() { console.log(this); }
var a = {
fn : c
}
a.fn(); // ? Object,c在一个字面量里面,字面量创建的对象也相当于new了一次,所以
//this指向一个实例对象
var e = {
fn : function() {
c();
}
}
e.fn(); // ? window 这是一个匿名函数,this指向window,这里相当于
//var e = {
// fn : function() {
// function() {
// console.log(this);
// }
// }
//}
eval()--该函数执行时的作用域是当前作用域,等同于在该行将里面的代码填进去,所以虽然在指向的时候看起来没有指定当前对象,但是this不是指向window的;
关于addEventListener()和attachEvent():
在IE中,使用attachEvent进行事件绑定,this指向的是window而不是当前节点;
在其他浏览器中,使用adEventListener进行事件绑定,this指向的是当前节点;
这里有个关于作用域的文章:关于JavaScript的作用域