• JavaScript中的this -- 好像很有道理版


    函数调用

    首先需要从函数的调用开始讲起。

    JS(ES5)里面有三种函数调用形式:

    func(p1, p2) 
    obj.child.method(p1, p2)
    func.call(context, p1, p2) // 先不讲 apply
    

    一般,初学者都知道前两种形式,而且认为前两种形式「优于」第三种形式。

    从看到这篇文章起,你一定要记住,第三种调用形式,才是正常调用形式:

    func.call(context, p1, p2)
    

    其他两种都是语法糖,可以等价地变为 call 形式:

    func(p1, p2) 等价于
    func.call(undefined, p1, p2)
    
    obj.child.method(p1, p2) 等价于
    obj.child.method.call(obj.child, p1, p2)

    请记下来。(我们称此代码为「转换代码」,方便下文引用)

    至此我们的函数调用只有一种形式:

    func.call(context, p1, p2)
    这样,this 就好解释了

    this,就是上面代码中的 context。就这么简单。

    this 是你 call 一个函数时传的 context,由于你从来不用 call 形式的函数调用,所以你一直不知道。

    先看 func(p1, p2) 中的 this 如何确定:

    当你写下面代码时

    function func(){
      console.log(this)
    }
    
    func()
    

    等价于

    function func(){
      console.log(this)
    }
    
    func.call(undefined) // 可以简写为 func.call()
    

    按理说打印出来的 this 应该就是 undefined 了吧,但是浏览器里有一条规则:

    如果你传的 context 不是一个对象,那么 window 对象就是默认的 context。
    (这条规则在 Node.js 和 strict 模式下会稍微不一样,不过那不是我们现在要讨论的)

    因此上面的打印结果是 window。

    如果你希望这里的 this 不是 window,很简单:

    func.call(obj) // 那么里面的 this 就是 obj 对象了
    

    再看 obj.child.method(p1, p2) 的 this 如何确定

    var obj = {
      foo: function(){
        console.log(this)
      }
    }
    
    obj.foo()
    

    按照「转换代码」,我们将 obj.foo() 转换为

    obj.foo.call(obj)
    

    好了,this 就是 obj。搞定。

    总结

    this就是最后执行函数的对象


    作者:方应杭
    链接:https://www.zhihu.com/question/19636194/answer/132143515
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Qt5 webview加载本地网页
    pwiz, a model generator
    编译python3
    [转]Centos配置国内yum源
    ubuntu下apt-get update出现hash校验和错误
    《LINUX程序设计 第四版》 阅读笔记:(一)
    [转]https方式使用git保存密码的方式
    用python产生一个好的秘钥
    Ubuntu关闭图形界面
    Numpy中的矩阵计算
  • 原文地址:https://www.cnblogs.com/wwg945/p/8893357.html
Copyright © 2020-2023  润新知