彻底搞清函数中的this指向

近日阅读《javascript设计模式与开发实践》

书中的apply和call调用函数层出不穷,很多妙用;

 

函数中的this是根据调用方式来决定的

函数调用方式有4中
1、直接调用 a(...arg); 函数a中的this总是绑定的window /严格模式下绑定的undefined
2、方法调用 a.b(...arg); 方法函数b会返回当前执行上下文的对象a;如果a.b.c(); 那么此时返回的就是b
3、构造器调用 new a(...arg);构造器不会引用任何上下文的内容,只是单纯的根据自己生成一个对象并且返回;
4、使用call/apply调用 a.call(this,...arg);

 

function add(){
        this.a = "add-a";
        console.log(this)
    }
    add();
    //控制台:window;
    //数据改变:此时会多一个全局变量a;window.a="add-a";

    var obj = {
        a:1,
        b:{
            a:2,
            c:add
        }
    }
    obj.b.c();
    //控制台:obj.b指向的对象 {a:"add-a",c:function add()...}
    //数据改变:直接调用类似,add会改变上下文的属性值;obj.b.a==="add-a"


    new obj.b.c();
    //控制台:通过构造器调用,不会改变obj.b.a;所以此时obj.b.a依然等于"add-a"
    //数据改变:无

    obj.b.c.call();
    //控制台:window;
    //数据改变:window.a的值会重新被赋值"add-a"
    //不传入参数或者传入undefined、null时,add中的this就会是全局对象
    //否则传入什么对象、运行时的this就是传入的对象
    //注意:这里其他的数据类型  String Number Boolean Object也会当做一个对象进行处理
    //例如: 
    obj.b.c.call(1);
    //控制台: Number {a: "add-a", [[PrimitiveValue]]: 1}
    obj.b.c.call(false);
    //控制台:Boolean {a: "add-a", [[PrimitiveValue]]: false}

 

posted @ 2017-05-22 12:39  四两websir  阅读(483)  评论(0编辑  收藏  举报