美文网首页
你不知道的javascirpt--(this)

你不知道的javascirpt--(this)

作者: O8 | 来源:发表于2017-02-25 16:50 被阅读0次

    这是你认识的this吗?

    初识javascript的时候,人们容易把this的理解指向函数的本身。
    function foo() { console.log(num) this.count++ } foo.count = 0 var i for (i = 0; i < 10; i ++){ if (i > 5) { foo(i) } } // 9,8,7,6

    console.log(foo.count) // 0

    运行程序输出了4个值,可以明确的是函数执行了4次,那么问题来了,为什么foo.count => 4?
    其实很多人对this都存在着误解。

    this到底是什么?

    首选我们要对this进行分析,this是变化的。在不同的情况下this的绑定不同的值。那我们首先要了解一下this的绑定的规则。this的绑定规则有一下几种规则:

    默认绑定

    function foo () {
    console.log(this.a)
    }
    var a = 1
    foo()
    // 1

    可以看出this.a被解析成了全局变量。this绑定在的全局对象上,a自动就成了1。foo()在不带任何修饰的情况下调用绑定了全局对象上,这种绑定称之为默认绑定。

    隐式绑定

    function foo() {
    console.log( this.a )
    }
    var obj={
    a: 2,
    foo: foo
    };
    obj.foo(); // 2

    此时的this绑定到了对象obj上了,我们称这种绑定为隐式绑定。隐式绑定的规则是把函数的this绑定到这个上下文的对象中。

    显式绑定

    function foo() {
    console.log( this.a )
    }
    var obj={
    a:2
    }
    foo.call( obj ) // 2

    通过 foo.call(..),我们可以在调用 foo 时强制把它的 this 绑定到 obj 上。

    new绑定

    function foo(a) {
    this.a = a;
    }
    var bar = new foo(2);
    console.log( bar.a ); // 2

    此时的this绑定在了fun上,这种通过new方式绑定的this就是new绑定。

    优先级

    new > 显式 > 隐式 > 默认

    相关文章

      网友评论

          本文标题:你不知道的javascirpt--(this)

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