读书笔记(you don't know js): this的理解(没写完...)

基本概念

首先,函数不能存储this的值,this指向哪里,取决于调用它的对象。若是没有这个对象,那默认就是window调用(非严格模式下)。也就是说this是在运行的时候定义的,不是在绑定的时候定义的。函数

function foo(num) {
        console.log("foo: " + num);
        this.count++
    }
    foo.count = 0;
    for(var i = 0; i < 10; i++) {
        foo(i);
    }
    console.log(foo.count) //输出是0,由于调
    console.log(window.count) // 输出是NAN, 由于window.count没有初始值

再贴一段代码oop

function foo() {
        var a = 2;
        this.bar();
    }
    function bar() {
        console.log( this.a );
    }
    window.a = 3;
    foo();//输出3,这个时候,是window.foo,由于bar也是由window调用

隐式绑定的问题

先看一个例子this

function foo() {
        console.log(this.a)
    }
    
    var obj = {
        foo: foo,
        a: 2
     }
     var bar = obj.foo();// 函数别名
     var a = "opps, global";
     obj.foo();// 输出2
     bar();// 输出opps, global,调用bar的是window

这个状况比较容易致使咱们在传回调函数的时候,出现this指向问题code

function foo() {
        console.log(this.a);
    }
    function doFoo(fn) {
        fn();
    }
    
    var obj = {
        a: 2,
        foo: foo
    }
    
    var a = "oops, global";
    doFoo(obj.foo); // 传递了一个函数过去,这个函数由window调用,因此最后输出的是"opps, global"

固然咱们能够很简单地用一个bind来解决问题对象

doFoo(obj.foo.bind(obj)

显示绑定(未完待续)

相关文章
相关标签/搜索