首页 技术 正文
技术 2022年11月15日
0 收藏 734 点赞 2,306 浏览 1450 个字

再分析详细内容之前,必需要好好阅读下面下面两篇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出错。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,487
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,486
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,126
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,287