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

JavaScript 的 this 让人很困惑,到底什么时候该用 this 呢?

  •  
  •   tedd · 2015-03-08 22:03:14 +08:00 · 3978 次点击
    这是一个创建于 3541 天前的主题,其中的信息可能已经有所发展或是发生改变。
    楼主是通过Python自学入门的编程,在Python中,按我有限的了解,this是在OO的场景下使用,指的是对象本身,来到了JS,this满天飞,而且不是指的‘对象’本身,我也看过一些资料,了解this需要先了解runtime context,谁call的这个方法,这个this就是指的那个caller,这样理解对吗?

    如果上面的理解正确,那看别人代码大概能看懂this了,自己写的时候就又头大了,什么时候需要用this呢?感觉js中面向对象和函数式编程混着,太难了...
    19 条回复    2015-03-10 01:48:27 +08:00
    RIcter
        1
    RIcter  
       2015-03-08 22:09:01 +08:00 via iPhone
    this 不是自己的意思_(:з」∠)_

    好像 stackoverflow 上有不錯的回答
    Bluecoda
        2
    Bluecoda  
       2015-03-08 22:11:44 +08:00
    js的this还不算难理解吧。ruby元编程的时候,self才真正满天飞。
    arachide
        3
    arachide  
       2015-03-08 22:25:36 +08:00
    @tedd

    了解this需要先了解runtime context,谁call的这个方法,这个this就是指的那个caller,这样理解对吗?



    结合that看一下就好了

    :-)
    EPr2hh6LADQWqRVH
        4
    EPr2hh6LADQWqRVH  
       2015-03-08 22:27:14 +08:00
    js的函数和python里面这点还挺像的,就是函数可以套在任何一个对象上执行。

    python的话就是第一个参数,约定俗称叫它self,但self并不是关键字,换成其他的一样运行。

    js的this和python里面的self一个效果,就是当前函数操作的对象,也就是套的对象,现在这个函数套在这个对象上执行。只不过this在js里是关键字,是隐含的。
    bumz
        5
    bumz  
       2015-03-08 22:27:50 +08:00
    this 指向通過「a.b()」調用的 a

    http://segmentfault.com/q/1010000000636749
    rentaro
        7
    rentaro  
       2015-03-08 22:33:50 +08:00
    推荐阅读《JavaScript 高级程序设计》 比你在这问有效
    billlee
        8
    billlee  
       2015-03-08 22:36:11 +08:00   ❤️ 2
    this 有三种用法

    ```javascript

    function fn() {
    alert(this.something);
    }

    something = "global";
    obj = {
    something: "object",
    method: fn
    };

    fn(); //global
    obj.method(); //object
    var obj2 = new fn(); //undefined
    ```
    FrankFang128
        9
    FrankFang128  
       2015-03-08 22:42:42 +08:00
    每次用 this 之前,console.log(this) 就好了。
    因为 this 是在运行时确定的。
    anewg
        10
    anewg  
       2015-03-08 22:44:52 +08:00
    tedd
        11
    tedd  
    OP
       2015-03-08 22:57:47 +08:00
    感谢所有回复的童鞋,Javascript高级程序设计已在京东下单,现在开始挨着看看楼上各位提供的链接
    Mutoo
        12
    Mutoo  
       2015-03-08 23:11:41 +08:00
    @anewg 这篇居然没讲到 func.bind()
    shibo501c
        13
    shibo501c  
       2015-03-08 23:19:43 +08:00
    yinxingren
        15
    yinxingren  
       2015-03-09 00:31:26 +08:00
    hkongm
        16
    hkongm  
       2015-03-09 10:04:25 +08:00
    首先 use strict
    其次 var _ = this
    再次 bind,apply,call
    tedd
        17
    tedd  
    OP
       2015-03-09 10:33:16 +08:00
    @hkongm 简单明了 :) 谢谢
    lalalanet
        18
    lalalanet  
       2015-03-09 11:06:10 +08:00
    hahasong
        19
    hahasong  
       2015-03-10 01:48:27 +08:00 via Android
    我和楼主相反,先学的js,后学的python,突然改用self还有点不习惯。js的this刚开始也是很容易晕菜,其实js的内置类型都是对象,谁调的方法,方法里的this就指哪个对象。call和apply可以将方法用指定对象调用。另外如果用框架或者别人封装的方法,那就要看文档怎么说了,或者你打印一下就知道了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1125 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.