渡一 13-2 this指向

1.函数预编译过程this->window
2.全局this->window
3.call/apply改变this指向
4.obj.func();func()里的this指向obj

function test(c){
    //var this = Object.create(test.prototype);
    //__proto__:test.prototype
    var a=123;
    function b(){}
}

AO{
    arguments:[1],
    this:window,
    c:1,
    a:undefined,
    b:function(){}
}

test(1);
//new test();

 

 

练习题

1.
var obj = {
    a:function(){
        console.log(this.name);
    },
    name:'abc'
}
obj.a(); //abc

2.
var name = "222";
var a={
    name:"111",
    say:function(){
        console.log(this.name);
    }
}
var fun=a.say;
fun();
a.say();

//output:222 111

var b={
    name:"333",
    say:function(fun){
        fun();
    }
}
b.say(a.say); //重点:这里执行的是fun();不是this.fun();所以是全局this
b.say = a.say;
b.say();

//output:222 333

 

var foo='123';
function print(){
    var foo='456';
    this.foo="789";
    console.log(foo);
}
print();//456


var foo=123;
function print(){
    this.foo = 234;
    console.log(foo);//this.foo->234
}
print();//234
new print();//123


1.运行test()和new test()的结果分别是什么?
var a = 5;
function test(){
    a=0;
    console.log(a);
    console.log(this.a);
    var a;
    console.log(a)
}
test()
//test output:0 5 0
//new test output:0 undefined 0


function print(){
    var marty = {
        name:"marty",
        printName:function(){console.log(this.name);}
    }
    var test1 = {name:"test1"};
    var test2 = {name:"test2"};
    var test3 = {name:"test3"};
    test3.pirntName = marty.printName;
    var printName2 = marty.printName.bind({name:123});
    marty.printName.call(test1);//test1
    marty.printName.apply(test2);//test2
    marty.printName();//marty
    printName2();
    test3.printName();//test3

}


var bar = {a:"002"};
function print(){
    bar.a="a";
    Object.prototype.b="b";
    return function inner(){
        console.log(bar.a);
        console.log(bar.b);
    }
}
print()();
//output:a b

 

posted @ 2021-09-17 05:52  lisa2544  阅读(32)  评论(0编辑  收藏  举报