js学习笔记之this

来源:互联网 发布:微信有淘宝接口 编辑:程序博客网 时间:2024/06/05 15:55

学习来源:

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]);



原创粉丝点击