学习来源:
http://www.cnblogs.com/pssp/p/5216085.html
http://www.cnblogs.com/xiaohuochai/p/5735901.html
最主要还是一句话 this指的是当前调用这个函数的对象。
his的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。
默认绑定 this == Window
1)全局环境中直接用this
alert(this); // Window
2)函数独立调用 严格模式下,独立调用的函数的this指向undefined
function foo(){
alert(this);
}
foo(); //Window
3)被嵌套的函数独立调用时
//虽然test()函数被嵌套在obj.foo()函数中,但test()函数是独立调用,而不是方法调用。所以this默认绑定到window
var a = 0;
var obj = {
a : 2,
foo:function(){
function test(){
alert (this.a);
}
test();
}
}
obj.foo(); //0
4)隐式丢失
var a = 0;
function foo(){
console.log(this.a);
};
var obj = {
a : 2,
foo:foo
}
var bar = obj.foo; //把obj.foo赋予别名bar,只是把foo()函数赋给了bar,而bar与obj对象则毫无关系
bar(); //0
等价于在2)函数直接在全局中调用 如下
var a = 0;
var bar = function foo(){
console.log(this.a);
}
bar(); //0
方法调用时(隐式绑定) this == 直接对象 (无论外面包几层)
function foo(){
console.log(this.a);
};
var obj1 = {
a:1,
foo:foo,
obj2:{
a:2,
foo:foo
}
}
obj1.foo(); //1
obj1.obj2.foo(); //2
new 构造函数(return问题)
1)无return / 有return / return this 情况一样 this == 新对象
function fn(){
this.a = 2; //这里的this就是这被构造出来的 test 所有 test.a 就是 2
无return / 有return / return this;
}
var test = new fn();
alert(test.a); //2
2)显式地return一个对象 this == return的对象
var obj = {a:1};
function fn(){
this.a = 2;
return obj;
}
var test = new fn();
alert(test.a); //1
显示绑定call(参数) apply(参数) this == 参数指定的对象
1)call可以有多个参数,第一个是指定的对象 后面是构造函数的参数
var a = 0;
function foo(){
console.log(this.a);
}
var obj = {
a:2
};
foo();//0
foo.call(obj);//2
2)call 多个参数
var a = {
user:"追梦子",
fn:function(e,ee){
console.log(this.user); //追梦子
console.log(e+ee); //3
}
}
var b = a.fn;
b.call(a,1,2);
3)apply也可以有多个参数,第一个是指定的参数 第二个则必须为数组 这个数组包括之后的所有参数
var a = {
user:"追梦子",
fn:function(e,ee){
console.log(this.user); //追梦子
console.log(e+ee); //11
}
}
var b = a.fn;
b.apply(a,[10,1]);