再分析详细内容之前,必需要好好阅读下面下面两篇blog

学习Javascript闭包(closure)

Javascript的this使用方法

这两篇文章是阮一峰老师对Javascript的闭包和this使用方法的总结。

总结来说。闭包能够大概的理解为运行函数对环境上下文的变量的绑定。

this是指向调用函数的环境对象。

第二篇中。this的使用方法阮老师是相对浏览器进行的分析。

在评论中非常多同学已经指出nodejs中this的keyword并不是文中那样的属性。

亲自实验之后发现确实如评论所说的。

(1)首先针对阮老师第二篇中第4段代码。在nodejs中片段例如以下:

var x = 1;
function test(){
this.x = 0;
}
test();
console.log(x); //1而非0

在阮老师的浏览器脚本环境中,阮老师说返回为0。也就是说this指向的是当前的window对象。

在nodejs中,当调用test()后,本代码片段所在的运行模块的全局x被置为1,此处用console输出的x仍是var声明的x。能够通过改动一下上面的代码得到验证。

x = 1;
function test(){
this.x = 0;
}
console.log(x); //返回1
test();
console.log(x); //返回0

(2)分析闭包篇中阮老师最后留给大家分析的代码

首先把代码贴出来:

var object = {
name : "My Object",
getNameFunc : function() {
console.log(this.name);
return function () {
return this.name;
};
}
};
console.log(object.getNameFunc()());


得到的结各自是My object 和 undefined.  这时预计非常多同学就不能理解,前面的输出是来自于闭包的使用,那后面的函数返回中this对象究竟来自于哪里?this不是应该指代调用该函数的那个环境对象吗?那个环境相应应该是什么呢?

事实上对代码稍作修改,就会得到一个初步的答案。

将第一行的代码 var name = “local"; 改为 name = “global";

我们就会发现第二个的结果有了输出,global 。

相信部分同学心里已经有了答案。那我们验证真正的原因。再次改造一下代码:

var object = {
name : "My Object",
getNameFunc : function(){
return function () {
return this.name;
};
}
};
name = "global";
console.log(object.getNameFunc()());
var obj = {
name : "last result",
myf : object.getNameFunc()
};
console.log(obj.myf());

nodejs执行后,分别得到输出 global 和 last result。

那答案已经很清楚。thiskeyword是在真正被运行到的时候才会发挥作用。this对象仍然是指代函数被运行时运行该函数的对象。

当我把object.getNameFunc()赋值给myf是,实际等价于将函数function (){ return this.name; }赋值给myf,当myf被调用的时候。this由运行确定指向了对象obj。

所以我们总结来说:

同学们都被阮老师忽悠了!!!

可是Javascript中闭包和this都是非常关键的知识,须要全然掌握,否则非常easy出错。

nodejs中thiskeyword的问题的更多相关文章

  1. nodejs中获取时间戳、时间差

    Nodejs中获取时间戳的方法有很多种,例如: new Date().getTime() Date.now() process.uptime() process.hrtime() 平时想获取一个时间戳 ...

  2. 在Nodejs中如何调用C#的代码

    最近需要在Nodejs中用到C#的代码,从网上了解到可以采用Edgejs来实现Nodejs与C#的代码交互, 直接复制网上的代码运行总是出各种错,填了不少坑,现在把自己的案例代码大致整理一下,方便以后 ...

  3. nodejs 中自定义事件

    经常看到 req.on('error', function(){...}); 这种代码. 在nodejs中,可以使用 EventEmitter来实现. 具体的关键词有如下几个: var reqEven ...

  4. NodeJS中的异步I/O、事件驱动

    nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在 ...

  5. nodejs中Stream的理解

    在nodejs中可以通过fs模块读写文件,我们来看下fs模块提供的接口: fs.readFile(filename, callback) 异步读取文件. filename是读取文件的文件名,如果是相对 ...

  6. Nodejs中的this

    以下内容都是关于在nodejs中的this而非javascript中的this,nodejs中的this和在浏览器中javascript中的this是不一样的. 在全局中的this console.l ...

  7. 探讨Nodejs中的作用域问题。

    在JS中有全局作用域和函数作用域,而在Nodejs中也自己的作用域,分为全局作用域(global)和模块作用域. js作用域: 以前学js的时候我们的全局对象是window,如: var a = 10 ...

  8. nodejs中exports与module.exports的实践

    只要是在nodejs中写自己的文件模块就少不了会遇到module.exports和exports的使用,看别人的代码大多都会使用“module.exports=exports=<对象/函数等&g ...

  9. 详细讲解nodejs中使用socket的私聊的方式

    详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...

随机推荐

  1. 洛谷P1533 可怜的狗狗 [平衡树,FHQ_Treap]

    题目传送门 可怜的狗狗 题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗狗. 题目描述 小卡家有N只狗,由于品种.年龄不同,每一只狗都 ...

  2. Git 版本控制管理(一)

    Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git  —— The stupid content tracker(傻瓜式的内容跟踪器) 关于 Git 的 ...

  3. 初识PHP(一)

    做为一名合格的前端开发攻城狮,了解一门服务端语言是必须的,所以我选了php.都说学的第一门语言对第二门语言会产生较大的影响,确实,每当我看到一个php知识点时,就同时会想到这个知识点在Javascri ...

  4. 用js来实现那些数据结构及算法—目录

    首先,有一点要声明,下面所有文章的所有内容的代码,都不是我一个人独立完成的,它们来自于一本叫做<学习JavaScript数据结构和算法>(第二版),人民邮电出版社出版的这本书.github ...

  5. android 滑动冲突

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 通过move事件的 拦截. 在滑动组件中,重写 在拦截触摸事件的时候  这个方法, 然后 ...

  6. 网络与多线程---OC中多线程方法GCD(二)

    小编在前一篇中介绍了多线程实现的五种常用方法.在接下来所介绍的这种方法是最具有魅力的,最具有诱惑的实现多线程的方案---GCD 一.什么是GCD GCD是Grand Central Dispatch的 ...

  7. Codeforces.838D.Airplane Arrangements(思路)

    题目链接 \(Description\) 飞机上有n个位置.有m个乘客入座,每个人会从前门(1)或后门(n)先走到其票上写的位置.若该位置没人,则在这坐下:若该位置有人,则按原方向向前走直到找到空座坐 ...

  8. CentOS 7 yum 安装subversion

    yum list installed | grep subversionyum install subversioncd /var/wwwsvn -hsvn co svn://121.196.226. ...

  9. Slickflow.NET 开源工作流引擎基础介绍(十) -- 邮件轮询异步发送模块集成

    前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. ...

  10. [原创]WebScarab工具介绍

    [原创]WebScarab工具介绍 一 WebScarab介绍 WebScarab是一个用来分析使用HTTP和HTTPS协议的应用程序框架.其原理很简单,WebScarab可以记录它检测到的会话内容( ...