再分析详细内容之前,必需要好好阅读下面下面两篇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. 2017, X Samara Regional Intercollegiate Programming Contest 题解

    [题目链接] A - Streets of Working Lanterns - 2 首先将每一个括号匹配串进行一次缩减,即串内能匹配掉的就匹配掉,每个串会变成连续的$y$个右括号+连续$z$个左括号 ...

  2. org.apache.maven.archiver.MavenArchiver.getManifest错误

    eclipse导入新的maven项目时,pom.xml第一行报错: org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.mav ...

  3. CSS3利用一个div实现内圆角边框效果

    *首先要清楚的是,box-shadow的形状会随着border-radius变化.下面的例子可以证明: <!doctype html> <html lang="en&quo ...

  4. 多线程学习笔记四之Condition实现分析

    目录 简介 等待队列 nextWaiter 源码分析 await() signal() signalAll() 总结 简介   在使用内置锁synchronized时,通过调用java.lang.Ob ...

  5. python scrapy 调试模式

    scrapy通过命令行创建工程,通过命令行启动爬虫,那么有没有方式可以在IDE中调试我们的爬虫呢? 实际上,scrapy是提供给我们工具的, 1. 首先在工程目录下新建一个脚本文件,作为我们执行爬虫的 ...

  6. swiper实例应用

    1.手机竖屏单页滑 为了防止图压缩,单独切图,背景用纯色 2.自由滑 很长的图,自由切割

  7. Win10 主题 美化 动漫

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha  313134555@qq.com High School D×D 塔城白音Win7主题+Win8主题+Win10主题 Win10 ...

  8. POJ.1379.Run Away(模拟退火)

    题目链接 POJ输出不能用%lf! mmp从4:30改到6:00,把4:30交的一改输出也过了. 于是就有了两份代码.. //392K 500MS //用两点构成的矩形更新,就不需要管边界了 #inc ...

  9. 如何调整word中表格某一列占半分比

    1.可以拖动,但是不准确 2.

  10. DirectX全屏游戏中弹出窗口(转)

    一直有人问如何在DirectX全屏游戏中弹出窗口就象金山游侠一样.我答应过要给出原码,只是一直没有时间整理,不过现在总算是弄玩了.代码不长,大致作了些注释,但愿你能看懂:)按照我的说明一步步作应该就能 ...