我是HTML

this

(1) /*通过this传递了对象的引用*/
    function identify() {
        console.log(this); //this指向不是window 而是call改变指向的对象
        return this.name.toUpperCase();

    }
    function speak() {
        var greeting ='hello i am'+identify.call(this);
        return greeting;

    }
    var you={
        name:'zhangsan'
    };
    let me={
        name:'hxq'
    };
//    console.log(identify.call(me));
//    console.log(identify.call(me)); //HXQ
//    console.log(identify.call(you)); //ZHANGSAN

    console.log(speak.call(me)) //HXQ

(2))
!(function () {
    /*误解:this指向函数本身*/
    function fn(n) {
        console.log(n);
        this.count++;//NAN
    }
    fn.count=0;


    var i;
    for (i=0;i<10;i++){
        if(i>5){
            fn(i);
        }
    }
    console.log(fn.count);//o
})()

 

/*隐式绑定*/
    function foo() {
        console.log(this.a);
    }
    var obj={
        foo:foo,
        a:2
    }
    obj.foo() //2
    var fn=obj.foo; //undefined
function foo() {
        console.log(this.a); //42
    }
    var obj2 = {
        a: 42,
        foo: foo
    }
    var obj1 = {
        a: 2,
        obj2: obj2
    }
    obj1.obj2.foo()

 


//硬绑定 强行把foo中的this绑定在对象上
    function foo() {
     console.log(this.a);
     }
     var obj = {
     a: 2
     };
     var bar=function () {
     foo.call(obj);
     }
     bar(); //2
     setTimeout(bar,1000);//2
     bar.call(this);//2
     bar.call(window);//2

 

function foo(sm) {
        console.log(this.a,sm);
        return this.a + sm

    }
    var obj={
        a:2
    }
    var bar=function () {
        return foo.apply(obj,arguments); //用apply改变this指向并且传参(参数为一个对象)
    }
    var b=bar(3); //2,3
    console.log(b);//5

 

 

 




posted @ 2017-09-09 14:30  你值得拥有xxx  阅读(178)  评论(0编辑  收藏  举报