Javascript 匿名函数与闭包
请见如下一个闭包示例:
color = "red"; var obj = { color: "blue", getColor: function () { function displayColor() { return this.color; } return displayColor(); } } console.log(obj.getColor());
在getColor函数内部再定义了一个displayColor,再又定义了一个displayColor函数,从而形成闭包,最后将地上displayColor函数返回,这里发现这样定义其实作用不大,可以使用匿名函数替代直接返回:
color = "red"; var obj = { color:"blue", getColor: function () { return function() { return this.color; } } } console.log(obj.getColor()()); //输出 red
闭包中匿名函数和this对象
在javascript 中this 对象是基于函数的执行环境绑定的:在全局函数中, this等于全局环境即 window (浏览器环境)或者globle(node中),而当函数作为某个对象的方法调用时this等于该对象。不过匿名函数的执行环境具有全局性,其this 通常指向window(浏览器)或者globle(node环境),因此上面例子中,输出的是全局对象的 color定义。
为什么没有获得闭包外面定义的blue呢?
如前文所述,函数被调用时,其活动对象会取得两个特殊的变量,arguments和this,因此在搜索的时候在作用域链的最前端即当前活动对象中就查找到了,不会进一步向上层查找。不过我们可以把外部作用域的this对象保存在一个闭包能够访问到的变量里,这样就能够访问外层对象了:
color = "red"; var obj = { color:"blue", getColor: function () { var self=this; return function() { return self.color; } } } console.log(obj.getColor()()); //输出 blue
最后,看一道百度2015年 前端开发南京站笔试题:
var myObject = { foo: "bar", func: function() { var self = this; console.log("outer func: this.foo = " + this.foo); //输出 bar console.log("outer func: self.foo = " + self.foo); //输出 bar (function() { console.log("inner func: this.foo = " + this.foo); //输出 undefined console.log("inner func: self.foo = " + self.foo); //输出 bar }()); } }; myObject.func();
问,输出结果是什么? 相信现在应该比较好理解了。
分类:
Javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?