[js高手之路]this知多少
this关键字在javascript中的变化非常的灵活,如果用的不好就非常恶心,用的好,程序就非常的优雅,灵活,飘逸.所以掌握this的用法,是每一个前端工程师必知必会的.而且这个也是一些大公司笔试中常见的考察项.
第一种、单独的this,指向的是window这个对象
function show(){
alert( this ); //window
}
show();
show()这样子调用,指向的是window
第三种、函数调用的时候,前面加上new关键字,也就是构造函数的调用方式
function show(){
alert( this ); //object
}
new show();
new show这样调用,函数中的this指向的是object
第四种、用call与apply的方式调用函数,这里面的this分两种情况
- 一般情况下,call与apply后面的第一个参数, 该参数是什么, this就指向什么
- call与apply后面如果是undefined和null,this指向的是window
function show(){
alert( this ); //abc
}
show.call('abc'); //abc
function show(){
alert( this );
}
show.call( null ); //window
show.call( undefined ); //window
show.call( '' ); //''
function show( a, b ){
alert( this + '\n' + a + ',' + b ); //abc, ghostwu, 22
}
show.call( "abc", 'ghostwu', 22 );
show.apply( "abc", ['ghostwu', 22] );
function show( a, b ){
alert( this + '\n' + a + ',' + b );
}
show.call( "abc", 'ghostwu', 22 ); //abc, ghostwu, 22
show.apply( null, ['ghostwu', 22] ); //window, ghostwu, 22
show.apply( undefined, ['ghostwu', 22] );// window, ghostwu, 22
这里要稍微注意一下, call与apply后面的参数传递的区别: call是一个个把参数传递给函数的参数,而apply是把参数当做数组传递给函数的参数,数组第一项传递给函数的第一个参数,第二项传递给函数的第二个参数。。。以此类推
第五种、定时器中的this,指向的是window
setTimeout( function(){
alert( this ); //window
}, 500 );
第六种、元素绑定事件,事件触发后 执行的函数中的this 指向的是当前的元素
<input type="button" value="点我">
<script>
document.querySelector("input").onclick = function(){
alert(this); //指向当前按钮
};
</script>
第七种、函数调用时如果绑定了bind, 那么函数中的this就指向了bind中绑定的东西
<input type="button" value="点我">
document.querySelector("input").addEventListener("click", function(){
alert(this); //window
}.bind(window));
如果没有通过bind改变this,那么this的指向就会跟第六种情况一样
第八种、对象中的方法:该方法被哪个对象调用,那么方法中的this就指向该对象
var obj = {
userName : "ghostwu",
show : function(){
return this.userName;
}
};
alert( obj.show() ); //ghostwu
如果把对象的方法,赋给一个全局变量,然后再调用,那么this指向的就是window.
var obj = {
userName : "ghostwu",
show : function(){
return this.userName;
}
};
var fn = obj.show;
var userName = 'hello';
alert( fn() );// hello, this指向window
学完之后,我们就来应用下,下面这道题是腾讯考察this的面试题,你都能做出来吗?
var x = 20;
var a = {
x: 15,
fn: function () {
var x = 30;
return function () {
return this.x;
};
}
};
console.log(a.fn()); //function(){return this.x}
console.log((a.fn())()); //
console.log(a.fn()()); //
console.log(a.fn()() == (a.fn())()); //true
console.log(a.fn().call(this)); //
console.log(a.fn().call(a)); //
你如果真的搞懂了this,面向对象水平也不错的话,可以来试试,我的博客中这道腾讯的面试题额:
学生问的一道javascript面试题[来自腾讯]
[js高手之路]this知多少的更多相关文章
- [js高手之路] javascript面向对象写法与应用
一.什么是对象? 对象是n个属性和方法组成的集合,如js内置的document, Date, Regexp, Math等等 document就是有很多的属性和方法, 如:getElementById, ...
- [js高手之路] es6系列教程 - 对象功能扩展详解
第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...
- [js高手之路]从原型链开始图解继承到组合继承的产生
基于javascript原型链的层层递进查找规则,以及原型对象(prototype)的共享特性,实现继承是非常简单的事情 一.把父类的实例对象赋给子类的原型对象(prototype),可以实现继承 f ...
- [js高手之路]原型对象(prototype)与原型链相关属性与方法详解
一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...
- [js高手之路]设计模式系列课程-发布者,订阅者重构购物车
发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...
- [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表
所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...
- [js高手之路]深入浅出webpack系列2-配置文件webpack.config.js详解
接着上文,重新在webpack文件夹下面新建一个项目文件夹demo2,然后用npm init --yes初始化项目的package.json配置文件,然后安装webpack( npm install ...
- [js高手之路]深入浅出webpack教程系列6-插件使用之html-webpack-plugin配置(下)
上文我们对html-webpack-plugin的实例htmlWebpackPlugin进行了遍历分析,讲解了几个常用属性( inject, minify )以及自定义属性的添加,本文,我们继续深入他 ...
- [js高手之路]深入浅出webpack教程系列5-插件使用之html-webpack-plugin配置(中)
上文我们讲到了options的配置和获取数据的方式,本文,我们继续深入options的配置 一.html-webpack-plugin插件中的options除了自己定义了一些基本配置外,我们是可以任意 ...
随机推荐
- 玩玩微信公众号Java版之二:接收、处理及返回微信消息
前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~ 可以用我们的微信号来直接进行测试,下面先看测试效果图: 这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧! 首先可 ...
- 如是使用JS实现页面内容随机显示
之前有个客户咨询我,因为他们公司的业务员有多个人,但公司网站的联系方式板块里只够放一个人的信息,所以就想能不能实现这个联系方式信息随机显示,对于业务或客服人员来说也能做到分配均匀公平.本文我们将和大家 ...
- LCS 51Nod 1134 最长递增子序列
给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行:1个 ...
- 自带win10的笔记本电脑如何装win7
网上那么多的装机教程,还有必要专门写一篇装机攻略么?有的,非常必要的!因为真的有很多未知的坑要趟!首先,win10好不好?除了正版,其他没什么好的...如果没有SSD,经常要卡死于磁盘读写.当然,你可 ...
- java 线程之concurrent中的常用工具 CyclicBarrier
一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...
- Echarts关系图-力引导布局
需要做一个树形图,可以查看各个人员的关系. 可伸缩的力引导图-失败 刚开始,打算做一个可展开和伸缩的,搜索时候发现CSDN有一篇美美哒程序媛写的Echarts Force力导向图实现节点可折叠. 这里 ...
- VMware workstation批量创建虚拟机和自动化安装操作系统(一)
一. 简述 作为从事IT行业运维工作的Linuxer,大多情况下需要在测试环境中部署业务系统并进行测试,在没有足够的计算存储网络条件下,使用虚拟机进行虚拟集群的创建和使用,是一种不错的学习和实践方式. ...
- Datatables快速入门开发--一款好用的JQuery表格插件
博主是一个java后端程序员小白,前端技术会用但不精通,做后台的一些功能经常要涉及表格的展示,分页,搜索,排序等等一系列功能,在经历了一段时间的原始手段,开始接触并使用Datatables,一个jqu ...
- spring Bean类自动装载实现
先贴spring的开发文档,有助于大家学习http://shouce.jb51.net/spring/beans.html#beans-factory-class 一直想研究一下spring bean ...
- HPU--1221 Fibonacci数列
题目描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入 输入包含一个整数n. ...