this关键字在javascript中的变化非常的灵活,如果用的不好就非常恶心,用的好,程序就非常的优雅,灵活,飘逸.所以掌握this的用法,是每一个前端工程师必知必会的.而且这个也是一些大公司笔试中常见的考察项.

第一种、单独的this,指向的是window这个对象

console.log( this ); //window
注:当前的执行环境是window, 所以this指向了window
 
第二种、全局函数中的this
 
         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知多少的更多相关文章

  1. [js高手之路] javascript面向对象写法与应用

    一.什么是对象? 对象是n个属性和方法组成的集合,如js内置的document, Date, Regexp, Math等等 document就是有很多的属性和方法, 如:getElementById, ...

  2. [js高手之路] es6系列教程 - 对象功能扩展详解

    第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...

  3. [js高手之路]从原型链开始图解继承到组合继承的产生

    基于javascript原型链的层层递进查找规则,以及原型对象(prototype)的共享特性,实现继承是非常简单的事情 一.把父类的实例对象赋给子类的原型对象(prototype),可以实现继承 f ...

  4. [js高手之路]原型对象(prototype)与原型链相关属性与方法详解

    一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...

  5. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车

    发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...

  6. [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

    所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...

  7. [js高手之路]深入浅出webpack系列2-配置文件webpack.config.js详解

    接着上文,重新在webpack文件夹下面新建一个项目文件夹demo2,然后用npm init --yes初始化项目的package.json配置文件,然后安装webpack( npm install ...

  8. [js高手之路]深入浅出webpack教程系列6-插件使用之html-webpack-plugin配置(下)

    上文我们对html-webpack-plugin的实例htmlWebpackPlugin进行了遍历分析,讲解了几个常用属性( inject, minify )以及自定义属性的添加,本文,我们继续深入他 ...

  9. [js高手之路]深入浅出webpack教程系列5-插件使用之html-webpack-plugin配置(中)

    上文我们讲到了options的配置和获取数据的方式,本文,我们继续深入options的配置 一.html-webpack-plugin插件中的options除了自己定义了一些基本配置外,我们是可以任意 ...

随机推荐

  1. @Component @Controller @Service @Repository@Resourse

    @Component @Controller @Service @Repository@Resourse这些全部是Spring提供的注解. 其中@Component用来表示把一个类纳入spring容器 ...

  2. jenkins IOS- ad-hoc 打包

    背景 客户无大企业证书,只有开发者证书,如果进行开发分发测试只能采用两种方式 testfight ad-hoc打包 上testfight存在一定的审核时间,排除掉,最后选择打ad-hoc的包 解决 查 ...

  3. date——sql查询

    场景:在数据库中要删除一条记录,但是该记录的唯一性只能通过插入数据库的系统时间来确定,字段为date类型,格式是:2016/10/19 17:17:29. 1 解决 在百度上找到的方法是使用to_ch ...

  4. iOS开发实战-卫P嗯上网项目

    写在前面 最近闲来无事,又跟小伙伴搞起.一.键.上.网.的项目,于是这个项目就来了. 很高兴App 已经过审 有兴趣的可以玩玩牛牛数据

  5. Android高效内存之让你的图片省内存

    Android高效内存之让你的图片省内存 在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用.而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可 ...

  6. [BZOJ 1500]维修数列 [Splay Tree从进阶到住院]

    历尽艰辛终于A掉了这题QwQ 贴COGS评论区几句话=.= 策爷:"splay/块状链表的自虐题.".深刻理解到如果没有M倾向就不要去写这题了.. -Chenyao2333 记得b ...

  7. Java之线程,常用方法,线程同步,死锁

    1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...

  8. Hadoop新生报到(一) hadoop2.6.0伪分布式配置详解

    首先先不看理论,搭建起环境之后再看: 搭建伪分布式是为了模拟环境,调试方便. 电脑是win10,用的虚拟机VMware Workstation 12 Pro,跑的Linux系统是centos6.5 , ...

  9. Angular2 VS Angular4 深度对比:特性、性能

    欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~​ 在Web应用开发领域,Angular被认为是最好的开源JavaScript框架之一. Google的Angular团队已于3月 ...

  10. vue-router的使用

    关于vue-router的基本使用方法    首先,需要下载vue-router npm install vue-router --save vue-router在html或组件中的展现 ``` &l ...