美文网首页
this的用法

this的用法

作者: SEELE7 | 来源:发表于2017-08-21 14:33 被阅读0次

默认绑定:

当直接调用一个函数的时候 , 就是默认绑定

1 . 非严格模式下,默认绑定到 window上

2 . 严格模式下,没有绑定,返回 undefinde

隐式绑定:

当使用 对象.方法( ) 这种调用方式 , 称之为隐式绑定

this就绑定在调用的对象上

var name = "张三"
    var obj = {
        name : "李四",
        foo : function () {
            console.log(this.name);
        }
    }
    var foo = obj.foo;
    foo()

    //输出张三
    //谁调用指向谁(严格模式下会报错,因为严格模式下没有默认绑定)

new绑定:

使用new来调用构造函数的方式,this是绑定在新创建的那个对象上

在混合绑定中 , new优先级高

显示绑定

call , apply

仅仅这一次调用的时候使用了显示绑定, 对原函数没有任何的影响;

call和apply的区别就是参数传递的方式 :

call的参数是一个个传递参数

    function foo(a, b) {
        console.log(this.name, a, b);
    }

    foo.call({name: "张三"}, a, b);

apply是把函数封装到一个数组中去传递

    function foo(a, b) {
        console.log(this.name, a, b);
    }

    //foo.call({name: "张三"}, a, b);
    foo.apply({name:"张三"},[a,b])

String.prototype.toString.call() 显示内置类型

bind :固定绑定

调用函数对象的bind方法,就可以返回一个固定this绑定的新的函数

对原来的函数没有影响

    var obj = {name:"张三"}
    function foo() {
        console.log(this.name);
    }
    var f = foo.bind(obj)

    var obj2 = {
        name : "李四",
        foo : f
    }
    obj2.foo()

//输出结果给obj中的张三

优先级:固定绑定 -> 显示绑定 > new绑定 > 隐式绑定

回调函数的this绑定丢失问题

var name = "张三"
    var obj = {
        name : "李四",
        show : function () {
            setInterval(function () {
                console.log(this.name)
            },1000)
        }
    }
    obj.show()
#返回张三

解决方案1:

    var name = "张三"
    var obj = {
        name : "李四",
        show : function () {
            var that = this;
            setInterval(function () {
                console.log(that.name)
            },1000)
        }
    }
    obj.show()

解决方案2:

var name = "张三"
    var obj = {
        name : "李四",
        show : function () {
            setInterval(function () {
                console.log(this.name)
            }.bind(this),1000)
        }
    }
    obj.show()

显示绑定的丢失问题:

显示绑定到undefined和null上面的时候,会自动绑定当window上

相关文章

网友评论

      本文标题:this的用法

      本文链接:https://www.haomeiwen.com/subject/nzwcdxtx.html