JS闭包中的this对象
2014-03-23 18:03 大额_skylar 阅读(587) 评论(0) 编辑 收藏 举报我们知道,当函数被作为某个对象的方法调用时,this等于那个对象,不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window。
下面代码很好的说明了这一点:
1 var name = 'The Window'; 2 3 var object = { 4 name : 'My Object', 5 getNameFunc : function(){ 6 return function(){ 7 return this.name; 8 } 9 } 10 }; 11 12 alert(object.getNameFunc()());
小贴士:我在写这行小代码的时候出了一个错,后来发现是一不留神name结尾的逗号写成了句号。注意,在定义对象字面量的过程中,各个属性之间要记得是用逗号分隔。
弹窗结果:‘ The Window’
问: 那么为什么匿名函数没有取得其包含作用域的this对象呢?
答:每个函数在被调用时都会自动获取两个特殊变量:this 和 arguments。 内部函数在搜索这两个变量时,指挥搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。
不过通过下面的代码可以做到这一点(直接访问外部函数中的变量):
var name = 'The Window'; var object = { name : 'My Object', getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()());
弹窗显示: ‘My Object’
不同之处在于把this对象赋给了一个that变量,即使在函数返回之后,that也仍然引用这object,所以会返回object。
在有的特殊的情况下,this的值可能会发发生有意思的意外改变,下面代码:
var name = 'The Window'; var object = { name : 'My Object', getName : function(){ return this.name; } }; //alert(object.getName()); //alert((object.getName)()); alert((object.getName = object.getName)());
弹窗显示,前面两个都是‘My Object’ 后面一个是‘The Window’。
这是因为复制表达式 object.getName = object.getName这个复制表达式的值是函数本身,所以this不能得到维持,因此返回了‘The Window’ .
【推荐】国内首个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如何颠覆传统软件测试?测试工程师会被淘汰吗?