nodejs中this关键字的问题
再分析具体内容之前,必须要好好阅读以下以下两篇blog
这两篇文章是阮一峰老师对Javascript的闭包和this用法的总结。
总结来说,闭包可以大概的理解为执行函数对环境上下文的变量的绑定。this是指向调用函数的环境对象。
第二篇中,this的用法阮老师是相对浏览器进行的分析。在评论中很多同学已经指出nodejs中this的关键字并非文中那样的属性。
亲自实验之后发现确实如评论所说的。
(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。
那答案已经非常清楚。this关键字是在真正被执行到的时候才会发挥作用。this对象仍然是指代函数被执行时执行该函数的对象。
当我把object.getNameFunc()赋值给myf是,实际等价于将函数function (){ return this.name; }赋值给myf,当myf被调用的时候,this由执行确定指向了对象obj。
所以我们总结来说:
同学们都被阮老师忽悠了!!!但是Javascript中闭包和this都是很关键的知识,需要完全掌握,否则很容易出错。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。