美文网首页
[JavaScript基础]this关键字和闭包

[JavaScript基础]this关键字和闭包

作者: 向布谷鸟说早安 | 来源:发表于2019-03-04 22:29 被阅读2次
    this指向问题

    https://github.com/mqyqingfeng/Blog/issues/7
    this一般有几种调用场景
    var obj = {a: 1, b: function(){console.log(this);}}
    1、作为对象调用时,指向该对象 obj.b(); // 指向obj
    2、作为函数调用, var b = obj.b; b(); // 指向全局window
    3、作为构造函数调用 var b = new Fun(); // this指向当前实例对象
    4、作为call与apply调用 obj.b.apply(object, []); // this指向当前的object

    但是下面的几种情况只能从ECMAScript规范来解释this的指向:
    概念:
    MemberExpression:函数调用()前的部分
    Reference:一种只存在于规范中的类型
    获取 Reference 组成部分的方法:
    GetValue:可以获取MemberExpression值的接口
    GetBase:可以获取Reference this的值的接口

    ECMAPScript规定:
    = ,||, 逗号表达式如果在MemberExpression中出现,在获取this的时候都必须用GetValue,而此时
    返回的类型不再是this,而是undenfined,只有用GetBase才能获取到MemberExpression的this。

    最后总结如下:
    如果在()前的函数调用中出现了= ,||, 逗号表达式,this值就会是undefined,在严格模式下会报错,非严格模式下指向window.
    如下测试:

    var value = 1;
    var foo = {
    value: 2,
    bar: function () {
    return this.value;
    }
    }

    //示例1
    console.log(foo.bar()); // 2
    //示例2
    console.log((foo.bar)()); // 2
    //示例3
    console.log((foo.bar = foo.bar)()); // 1
    //示例4
    console.log((false || foo.bar)()); // 1
    //示例5
    console.log((foo.bar, foo.bar)()); // 1

    call和apply
    闭包

    zepto和闭包

    相关文章

      网友评论

          本文标题:[JavaScript基础]this关键字和闭包

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