zoukankan      html  css  js  c++  java
  • this 绑定例外之间接引用

    在《你不知道的JavaScript》之“this全面解析”一节中,讲到了this绑定例外的间接引用,代码如下:

    function foo () {
      console.log(this.a)
    }
    
    var a = 2;
    
    var o = {
      a: 3,
      foo: foo
    }
    
    var p = {
      a: 4
    }
    
    o.foo(); // 3
    (p.foo = o.foo)(); // 2

    注意看最后一行,一开始很难理解,为什么打印出来的是2。

    书上的解释如下:

    赋值表达式 p.foo = o.foo 返回值是目标函数的引用, 因此调用位置是 foo() 而不是p.foo() 或者 o.foo()。 根据我们之前说过的, 这里会应用默认绑定。 

    估计我语文不是很好,所以读了好几遍才明白。

    还是用代码来解释上面这段话的意思吧:

    function foo () {
      console.log(this.a)
    }
    
    var o = {
      a: 3,
      foo: foo
    }
    
    var p = {
      a: 4
    }
    
    var = 2;
    
    var bar = (p.foo = o.foo); // <-- 注意这里
    console.log(bar); // ƒ foo () {console.log(this.a)} <-- 打印bar,发现执行了 (p.foo = o.foo) 后,会有一个返回值,将该返回值赋值给 bar,打印出来的是全局函数 foo
    bar(); // 2 <-- 相当于执行了  (p.foo = o.foo)() ,同上面那段代码中的最后一行

    所以 (p.foo = o.foo)() 就相当于执行了 foo() ,此时可应用 this 的绑定规则之一——默认绑定来确定 this 对应的对象,即全局对象,所以 this.a 就是 2。

    关于 this 的绑定规则,可参看 《你不知道的JavaScript》之“this全面解析”中的绑定规则一节。

  • 相关阅读:
    生成二维码
    XML 基础应用
    C# 后台模拟请求一般处理程序
    json
    导出excel td格式设置
    发布IIS后 上传文件过大失败解决方案
    SQL Server 日期+4位流水号
    垮库操作
    触发器结合游标删除关联表数据
    我是到今天才懂得“放疗”是居里夫人发明的,你呢?
  • 原文地址:https://www.cnblogs.com/lwl0812/p/10347243.html
Copyright © 2011-2022 走看看