V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Node.js
Express
PPA for Ubuntu
ppa:chris-lea/node.js
Sponsored by
UCloud
UCloud 爆款云主机
UCloud 再获 9.6 亿元 D 轮融资,有钱、任性、撒福利!爆款云主机,2核 / 2G / 2M 独享带宽 / 50G 高性能云盘,低至 99 元/月,且优惠补贴期长达 1 年!V2EX 社区用户使用活动码 v2ex-ucloud 注册 UCloud,再送 100 元代金券!
Promoted by UCloud
V2EX  ›  Node.js

node 中关于 this 全局对象和 var 的定义

  •  
  •   mihuoli · 129 天前 · 822 次点击
    这是一个创建于 129 天前的主题,其中的信息可能已经有所发展或是发生改变。
    var  name = "this windos";
    var object = {
        name   : "my object",
        getnamefunc : function () {
            return function () {
                return this.name;
            };
    
        }
    };
    var reslut  = object.getnamefunc();
    console.log(object.getnamefunc()());
    console.log(reslut);
    console.log(reslut.toString());
    console.log(reslut());
    console.log(object.name);
    console.log(name);```
    
    在看高程3 关于 this 在闭包中介绍
    如上代码
    
    我在终端用 node 跑范例代码 结果 浏览器 和 node 给出了不同的答案 
    
    在 node 7.7.2  结果
    
    undefined
    [Function]
    function () {
                return this.name;
            }
    undefined
    my object
    this windos
    
    在 chrome   57.0.2987.98 (64-bit)
    
    this windos
    function () {
                return this.name;
            }
    function () {
                return this.name;
            }
    this windos
    my object
    this windos
    
    15 回复  |  直到 2017-04-06 23:51:25 +08:00
        1
    yangff   129 天前
    因为 window 刚好有 name 罢了…… 不信你换成 fuckedName 试试
        2
    yangff   129 天前
    哦看错了……
        3
    yangff   129 天前
    好像我在 node 上跑出来的结果和你不一样哇
        4
    morethansean   129 天前
    有什么问题吗?你想问啥?
        5
    morethansean   129 天前
    没注意你 node 的结果……你怎么跑出来的?
        6
    SuperMild   129 天前
    闭包和 this 不能混为一谈。闭包只涉及变量,而 this 不是变量。 this 有另一套规则,不适用于闭包的规则。
        7
    SuperMild   129 天前
    正因为有时候 this 比较不好确定,所以才有了利用闭包 that = this 这样的做法。
        8
    Niphor   129 天前
    因为 node 没全局 window ,他是 global
    第一句 var name 并不会把 name 挂在 global 上...
        9
    Niphor   129 天前
    用 var 似乎会把 scope 指定在当前 module 中, node 运行 js 文件 每个文件都是一个闭包 好像
        10
    Cynic222   129 天前
    你肯定看错了 Node 的输出,console.log 的输出总是以 undefined 结束
        11
    mihuoli   129 天前
    @Niphor 我试了一下 的确  var name 不能 在 node 中不是定义全局变量
        12
    otakustay   129 天前
    你只要记住一点, node 里你写的 js 代码不是在全局跑,而是变成了一个函数的函数体,在这个函数里跑的就行,像__dirname 、 require 之类的都是这个函数的参数
        13
    otakustay   129 天前
    最简单的办法,写个 js :

    console.log(arguments.callee.toString());

    然后运行下看结果:

    function (exports, require, module, __filename, __dirname) { console.log(arguments.callee.toString());

    }
        14
    mihuoli   129 天前
    @otakustay 好的我试下
        15
    libook   112 天前
    node 里的全局对象是 global 吧,而且 node 里的作用域是按照 module 隔离的, var 声明的对象只存在于一个 module 内。。。
    话说为了避免歧义和 BUG ,已经半年多不用 var 了,项目上已经用 ESLint 严格要求禁止出现 var 指令了。。。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1122 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.7.5 · 48ms · UTC 16:51 · PVG 00:51 · LAX 09:51 · JFK 12:51
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1