JavaScript-this理解
javascript this可以绑定到:全局对象,自己定义的对象,用构造函数生成的对象,通过call或者apply更改绑定的对象
1.全局对象
1 2 3 4 5 | function globalTest(name){ this .name=name; } globalTest( 'tree' ); console.log(name); //tree,默认生成了全局对象name,这种写法一般是不允许的 |
2.自己定义的对象
var subway={ name:'1号线', speed:0, run:function(speed){ this.speed=speed; } }; subway.run(100); console.log(subway.speed); //100,this绑定到对象subway
3.用构造函数生成的对象
构造函数约定第一个字母要大写,只有用new调用的时候才算构造函数,否则跟普通函数没有什么不同,用new调用构造函数,this会绑定到生成的对象。
function Subway(speed){ this.speed=speed; } var s=new Subway(100); console.log(s.speed);//100;this绑定到新生成的对象
4.指定的对象,通过call或者apply绑定
call函数和apply函数的区别是参数不一样,两个方法都可以改变this绑定的对象,如下
call(obj,param1,param2……);
apply(obj,[]/*params[]参数数组*/);
function Subway(name){ this.name=name; this.speed=0; this.run=function(speed){ this.speed=speed; }; } var s=new Subway('1号线'); s.run(300); console.log('一号线速度为:',s.speed);//300;this绑定到新生成的对象s var s1=new Subway('2号线'); s.run.apply(s1,[100]); console.log('二号线速度为:',s1.speed);//100;this绑定到对象s1 s.run.call(s1,200); console.log('二号线速度为:',s1.speed);//200;this绑定到对象s1
最后:
javascript有一个设计缺陷,使得的this绑定混乱
var subway={ name:'1号线', speed:0, run:function(speed){ this.speed=speed; //绑定到对象本身 function test(speed){ this.speed=speed+50;//竟然绑定到全局变量了,真是匪夷所思啊 } test(speed); } }; subway.run(100); console.log(subway.speed);//100 console.log(speed);//150
解决方法约定用that代替this
var subway={ name:'1号线', speed:0, run:function(speed){ var that=this; //用that代替this this.speed=speed; function test(speed){ that.speed=speed+50; } test(speed); } }; subway.run(100); console.log(subway.speed);//150
作者:绿茶叶
出处:http://www.cnblogs.com/greenteaone/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个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如何颠覆传统软件测试?测试工程师会被淘汰吗?