[js高手之路]this知多少
2018-06-24 00:06:14来源:未知 阅读 ()
this关键字在javascript中的变化非常的灵活,如果用的不好就非常恶心,用的好,程序就非常的优雅,灵活,飘逸.所以掌握this的用法,是每一个前端工程师必知必会的.而且这个也是一些大公司笔试中常见的考察项.
第一种、单独的this,指向的是window这个对象
1 function show(){ 2 alert( this ); //window 3 } 4 show();
show()这样子调用,指向的是window
第三种、函数调用的时候,前面加上new关键字,也就是构造函数的调用方式
1 function show(){ 2 alert( this ); //object 3 } 4 new show();
new show这样调用,函数中的this指向的是object
第四种、用call与apply的方式调用函数,这里面的this分两种情况
- 一般情况下,call与apply后面的第一个参数, 该参数是什么, this就指向什么
- call与apply后面如果是undefined和null,this指向的是window
1 function show(){ 2 alert( this ); //abc 3 } 4 show.call('abc'); //abc
1 function show(){ 2 alert( this ); 3 } 4 show.call( null ); //window 5 show.call( undefined ); //window 6 show.call( '' ); //''
1 function show( a, b ){ 2 alert( this + '\n' + a + ',' + b ); //abc, ghostwu, 22 3 } 4 show.call( "abc", 'ghostwu', 22 ); 5 show.apply( "abc", ['ghostwu', 22] );
1 function show( a, b ){ 2 alert( this + '\n' + a + ',' + b ); 3 } 4 show.call( "abc", 'ghostwu', 22 ); //abc, ghostwu, 22 5 show.apply( null, ['ghostwu', 22] ); //window, ghostwu, 22 6 show.apply( undefined, ['ghostwu', 22] );// window, ghostwu, 22
这里要稍微注意一下, call与apply后面的参数传递的区别: call是一个个把参数传递给函数的参数,而apply是把参数当做数组传递给函数的参数,数组第一项传递给函数的第一个参数,第二项传递给函数的第二个参数。。。以此类推
第五种、定时器中的this,指向的是window
1 setTimeout( function(){ 2 alert( this ); //window 3 }, 500 );
第六种、元素绑定事件,事件触发后 执行的函数中的this 指向的是当前的元素
1 <input type="button" value="点我"> 2 <script> 3 document.querySelector("input").onclick = function(){ 4 alert(this); //指向当前按钮 5 }; 6 </script>
第七种、函数调用时如果绑定了bind, 那么函数中的this就指向了bind中绑定的东西
1 <input type="button" value="点我"> 2 document.querySelector("input").addEventListener("click", function(){ 3 alert(this); //window 4 }.bind(window));
如果没有通过bind改变this,那么this的指向就会跟第六种情况一样
第八种、对象中的方法:该方法被哪个对象调用,那么方法中的this就指向该对象
var obj = { userName : "ghostwu", show : function(){ return this.userName; } }; alert( obj.show() ); //ghostwu
如果把对象的方法,赋给一个全局变量,然后再调用,那么this指向的就是window.
1 var obj = { 2 userName : "ghostwu", 3 show : function(){ 4 return this.userName; 5 } 6 }; 7 var fn = obj.show; 8 var userName = 'hello'; 9 alert( fn() );// hello, this指向window
学完之后,我们就来应用下,下面这道题是腾讯考察this的面试题,你都能做出来吗?
1 var x = 20; 2 var a = { 3 x: 15, 4 fn: function () { 5 var x = 30; 6 return function () { 7 return this.x; 8 }; 9 } 10 }; 11 console.log(a.fn()); //function(){return this.x} 12 console.log((a.fn())()); //20 13 console.log(a.fn()()); //20 14 console.log(a.fn()() == (a.fn())()); //true 15 console.log(a.fn().call(this)); // 20 16 console.log(a.fn().call(a)); // 15
你如果真的搞懂了this,面向对象水平也不错的话,可以来试试,我的博客中这道腾讯的面试题额:
学生问的一道javascript面试题[来自腾讯]
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:判断IE浏览器版本
下一篇:js 判断数据类型的几种方法
- javascript —— this 2019-08-14
- Vue学习之路由vue-router传参及嵌套小结(十) 2019-08-14
- Vue学习之路由vue-router小结(九) 2019-08-14
- setInterval和setTImeout中的this指向问题 2019-05-22
- html.css.javascript 跟随着我一起走向前端之路 2019-05-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash