关于 Javascript 中 this 的疑问 - V2EX
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 2370 次点击
    这是一个创建于 3085 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码:

    '''

    引入 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     Solana     3018 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 13:38 PVG 21:38 LAX 06:38 JFK 09:38
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86