V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
forreal
V2EX  ›  Node.js

求教 javascript 的 this 的指向问题

  •  
  •   forreal · 2014-05-05 19:06:02 +08:00 · 2876 次点击
    这是一个创建于 3643 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚学javascript,看到《javascript语言精粹》中提到以函数调用模式调用函数时,this被绑定到全局对象。于是验证了一下,但是结果不太对劲,求教问题出在哪里?
    代码如下:
    var g = 'global';
    function tryit() {
    var g = 'self';
    console.log(this.g);
    }
    tryit();

    运行结果是 undefined
    ide是webstorm
    14 条回复    2014-08-08 22:31:27 +08:00
    Mutoo
        1
    Mutoo  
       2014-05-05 19:11:11 +08:00
    运行的结果是 undefined 没错,因为 tryit 并没有返回值。但是会在控制台打印"global"。
    forreal
        2
    forreal  
    OP
       2014-05-05 19:15:57 +08:00
    @Mutoo
    但是代码改成
    var g = 'global';
    function tryit() {
    g="cool"
    console.log(6);
    }
    tryit();

    结果就变成6了。
    Mutoo
        3
    Mutoo  
       2014-05-05 19:27:51 +08:00   ❤️ 1
    目测你是以 node 方式运行。那样的话 js 是以模块的方式被运行的,this 指向的是 node module。建议你用 Javascript Debug 模式运行。
    RIcter
        4
    RIcter  
       2014-05-05 19:29:00 +08:00
    顺带问一个(/ω\)
    var a = {
    a: 1,
    b: this.a
    }
    如何让a.b的值为a.a。如上方法并不可以。目前我的解决方法是b: window.a.a
    sd4399340
        5
    sd4399340  
       2014-05-05 19:33:47 +08:00   ❤️ 1
    http://bonsaiden.github.io/JavaScript-Garden/zh/#function.this

    ES5 注意: 在严格模式下(strict mode),不存在全局变量。 这种情况下 this 将会是 undefined。
    forreal
        6
    forreal  
    OP
       2014-05-05 19:40:30 +08:00
    @Mutoo

    @sd4399340

    真的是node原因,我把结果写在html页面里就和预想的一样了。
    forreal
        7
    forreal  
    OP
       2014-05-05 19:40:58 +08:00
    @Mutoo
    @sd4399340
    多谢
    NemoAlex
        8
    NemoAlex  
       2014-05-05 20:37:14 +08:00   ❤️ 1
    @RIcter
    var a = {
    a: 1,
    b: this.a.a
    }
    shichimiya
        9
    shichimiya  
       2014-05-05 20:43:59 +08:00   ❤️ 1
    @RIcter
    var a = {
    缩缩a: 1,
    缩缩b: eval(a.a)
    }
    zzNucker
        10
    zzNucker  
       2014-05-05 20:44:24 +08:00   ❤️ 1
    @RIcter
    var a = {
    a: 1,
    b: function(){return this.a}
    }

    function才会新建一个执行环境。单纯一个{}是没有执行环境的,也就是你肯定知道的“js没有块级变量”。
    RIcter
        11
    RIcter  
       2014-05-05 20:57:30 +08:00
    @NemoAlex 这种方法和window一样..
    @shichimiya 被萌到!
    @zzNucker 感谢=A=..
    arzusyume
        12
    arzusyume  
       2014-05-06 09:11:25 +08:00   ❤️ 1
    otakustay
        13
    otakustay  
       2014-05-06 11:33:30 +08:00   ❤️ 2
    node是因为在你的这段代码外面包了一层function,这层里面有module、exports、require这些,所以事实上你的var g并不是在global scope里的……

    ~/Dev/test ⌚ 11:33:17
    $ cat test.js
    console.log(arguments.callee.toString());

    ~/Dev/test ⌚ 11:33:21
    $ node test.js
    function (exports, require, module, __filename, __dirname) { console.log(arguments.callee.toString());

    }
    aec4d
        14
    aec4d  
       2014-08-08 22:31:27 +08:00
    @RIcter
    对象的属性可以使用存储函数set/get定义
    http://javascript.ruanyifeng.com/stdlib/object.html#toc11
    a = {
    a : 1,
    get b(){return this.a},
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5802 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:19 · PVG 14:19 · LAX 23:19 · JFK 02:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.