V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
cstome
V2EX  ›  JavaScript

关于 JavaScript 中 this 的疑问

  •  
  •   cstome · 2017-05-03 12:11:08 +08:00 · 2155 次点击
    这是一个创建于 2766 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码:

    '''

    引入 jQuery

    <input type="button" value="TEST" id="btn1">

    <script>
    var obj = {
    output: funciton() {
    code block;
    },
    click: function() {
    console.log(this);
    //这里输出按钮的 DOM Object
    this.output();
    //this.output() not a function.
    }
    }

    $("#btn1").click(obj.click);
    </script>

    '''

    话说在 V2EX 中如何优雅的显示代码,用 Markdown 缩进和换行都没了。
    8 条回复    2017-05-03 13:37:08 +08:00
    xcssum
        1
    xcssum  
       2017-05-03 12:16:30 +08:00
    推荐 你不知道的 js 关于 this 的讲得很详细
    IanPeverell
        2
    IanPeverell  
       2017-05-03 12:17:07 +08:00   ❤️ 1
    js 不是很懂,不过 markdown 这个锅你自己背,代码块不是用 ''' 而是用 ``` 不需要解释,而且 V2EX 有预览功能你自己可以先看一下效果再发出来
    bumz
        3
    bumz  
       2017-05-03 12:24:17 +08:00
    JS 中的 this 是运行时根据调用函数的(忘记名字了)确定的,例如 A.click() 中 click 是通过 A.click 调用的,所以 click 中 this 是 A

    但如果 var click; (click = A.click)(),此时函数执行前 A.click 已被求值,A 就丢失了,于是 click 中 this 就指向 windows (严格模式为 undefined)

    function evoke(fn) {fn()} evoke(A.click) 同理,此时 click 已经脱离的 A,this 指向 windows/undefined
    bumz
        4
    bumz  
       2017-05-03 12:25:51 +08:00
    evoke(A.click.bind(A)) 把 click 的 this 绑定到 A 即可解决这个问题。
    SuperMild
        5
    SuperMild  
       2017-05-03 12:31:44 +08:00
    看《你不知道的 js 》就可以了
    bramblex
        6
    bramblex  
       2017-05-03 12:48:04 +08:00
    @bumz

    context / 上下文
    wobuhuicode
        7
    wobuhuicode  
       2017-05-03 13:31:38 +08:00 via iPhone
    谁调用指向谁
    yoa1q7y
        8
    yoa1q7y  
       2017-05-03 13:37:08 +08:00
    这样理解一下
    可以把函数想象成一个工具,比如一把剪刀
    如果没人使用它 它就是一个独立存在的东西,此时的 this 就是 undefined (或 window )
    张三用这把剪刀,那 this 就指向张三
    很简单
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5328 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:40 · PVG 11:40 · LAX 19:40 · JFK 22:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.