nodejs中thiskeyword的问题
再分析详细内容之前,必需要好好阅读下面下面两篇blog
这两篇文章是阮一峰老师对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的问题的更多相关文章
- nodejs中获取时间戳、时间差
Nodejs中获取时间戳的方法有很多种,例如: new Date().getTime() Date.now() process.uptime() process.hrtime() 平时想获取一个时间戳 ...
- 在Nodejs中如何调用C#的代码
最近需要在Nodejs中用到C#的代码,从网上了解到可以采用Edgejs来实现Nodejs与C#的代码交互, 直接复制网上的代码运行总是出各种错,填了不少坑,现在把自己的案例代码大致整理一下,方便以后 ...
- nodejs 中自定义事件
经常看到 req.on('error', function(){...}); 这种代码. 在nodejs中,可以使用 EventEmitter来实现. 具体的关键词有如下几个: var reqEven ...
- NodeJS中的异步I/O、事件驱动
nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在 ...
- nodejs中Stream的理解
在nodejs中可以通过fs模块读写文件,我们来看下fs模块提供的接口: fs.readFile(filename, callback) 异步读取文件. filename是读取文件的文件名,如果是相对 ...
- Nodejs中的this
以下内容都是关于在nodejs中的this而非javascript中的this,nodejs中的this和在浏览器中javascript中的this是不一样的. 在全局中的this console.l ...
- 探讨Nodejs中的作用域问题。
在JS中有全局作用域和函数作用域,而在Nodejs中也自己的作用域,分为全局作用域(global)和模块作用域. js作用域: 以前学js的时候我们的全局对象是window,如: var a = 10 ...
- nodejs中exports与module.exports的实践
只要是在nodejs中写自己的文件模块就少不了会遇到module.exports和exports的使用,看别人的代码大多都会使用“module.exports=exports=<对象/函数等&g ...
- 详细讲解nodejs中使用socket的私聊的方式
详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...
随机推荐
- P2858 [USACO06FEB]奶牛零食Treats for the Cows
P2858 [USACO06FEB]奶牛零食Treats for the Cows区间dp,级像矩阵取数, f[i][i+l]=max(f[i+1][i+l]+a[i]*(m-l),f[i][i+l- ...
- maven自定义脚手架(快速生成项目)
Maven之自定义archetype生成项目骨架 利用脚手架生成 新项目 命令行方式 mvn archetype:generate \ -DarchetypeGroupId=com.xxx \ -Da ...
- Luogu1445 [Violet]樱花 ---- 数论优化
Luogu1445 [Violet]樱花 一句话题意:(本来就是一句话的) 求方程 $\frac{1}{X} + \frac{1}{Y} = \frac{1}{N!}$ 的正整数解的组数,其中$N \ ...
- HDU 4757 Tree 可持久化字典树 trie
http://acm.hdu.edu.cn/showproblem.php?pid=4757 给出一棵树,每个节点有权值,每次查询节点 (u,v) 以及 val,问 u 到 v 路径上的某个节点与 v ...
- Springboot 线程池配置
最近的项目里要手动维护线程池,然后看到一起开发的小伙伴直接用Java了,我坚信Springboot不可能没这功能,于是查了些资料,果然有,这里给一下. 首先我们都知道@Async标签能让方法异步执行, ...
- Android命令(更新……)
1.通过命令行安装包 语法:adb install -r apk包 例子:adb install -r D:\android\android-sdk-windows\platform-tools\L ...
- LPC43xx SGPIO Experimentation
LPC4350 SGPIO Experimentation The NXP LPC43xx microcontrollers have an interesting, programmable ser ...
- sqlserver 2012 查询时提示“目录名称无效”
重装系统或者用360等软件清理了相应的临时文件导致解决:在运行中输入 %temp% 回车,会跳出找不到路径的提示,然后到提示的目录建没有找到的目录文件夹即可.
- dtrace 相关资料
Here are some DTrace information sources: * [Oracle Wiki](https://wikis.oracle.com/display/DTrace/DT ...
- Unity3d学习笔记记录
1.发布到 ipad字体显示不出来,改变Position位置的Z轴为-1 2.发布打包有问题,记得用户权限有没有设置 3.ipad4分辨率:2048*1536 4.调整界面大小,尽量调整底下子对象位置 ...