• 转 JS 中的 this


    转载至:https://segmentfault.com/a/1190000009215974

    this的指向问题应该是让每一个前端er都头疼的问题,我也一样,曾经遇到甚至都是一顿乱猜。最近在研读一些书籍如《你不知道的JavaScript》和《JavaScript语言精粹与编程实践》,让我对this的问题豁然开朗。故写下此篇文章,分享一下我的心得。

    隐式绑定

    关于this,一般来说,谁调用了方法,该方法的this就指向谁,如:

    function foo(){
        console.log(this.a)
    }
    
    var a = 3;
    
    var obj = {
        a: 2,
        foo: foo
    };
    
    obj.foo(); // 输出2,因为是obj调用的foo,所以foo的this指向了obj,而obj.a = 2
    

      

     

    如果存在多次调用,对象属性引用链只有上一层或者说最后一层在调用位置中起作用,如:

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

      

     

    隐式丢失

    一个最常见的this绑定问题就是被隐式绑定的函数会丢失绑定对象,也就是说他回应用默认绑定,从而把this绑定到全局对象或者undefined上,取决于是否是严格模式。

    function foo() {
        console.log( this.a )
    }
    
    var obj1 = {
        a: 2,
        foo: foo
    }
    
    var bar = obj1.foo; // 函数别名!
    
    var a = "oops, global"; // a是全局对象的属性
    
    bar(); // "oops, global"
    

      

     

    虽然bar是obj.foo的一个引用,但是实际上,它引用的是foo函数本身,因此此时的bar()其实是一个不带任何修饰的函数调用,因此应用了默认绑定

    一个更微妙、更常见并且更出乎意料的情况发生在传入回调函数时

    function foo() {
        console.log( this.a )
    }
    
    function doFoo( fn ){
        // fn 其实引用的是 foo
        fn(); // <-- 调用位置!
    }
    
    var obj = {
        a: 2,
        foo: foo
    }
    
    var a = "oops, global"; // a是全局对象的属性
    
    doFoo( obj.foo ); // "oops, global"
  • 相关阅读:
    windows上docker部署springboot多实例
    oracle 如何搜索当前用户下所有表里含某个值的字段?
    VS2010/OpenGL配置
    (译)Minimal Shader(最小的着色器)
    (译)Cg Programming/Unity(Cg编程/Unity)
    (转)在Unity3D中控制动画播放
    Unity3d中使用assetbundle
    C# 操作 sqlite
    Unity3d网格合并
    在Unity3d中解析Lua脚本的方法
  • 原文地址:https://www.cnblogs.com/sunyaaa/p/6783274.html
Copyright © 2020-2023  润新知