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

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

console.log( this ); //window
注:当前的执行环境是window, 所以this指向了window
第二种、全局函数中的this
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面试题[来自腾讯]

[js高手之路]this知多少相关推荐

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

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

  2. [js高手之路]打造通用的匀速运动框架

    本文,是接着上文[js高手之路]匀速运动与实例实战(侧边栏,淡入淡出)继续的,在这篇文章的最后,我们做了2个小实例:侧边栏与改变透明度的淡入淡出效果,本文我们把上文的animate函数,继续改造,让他 ...

  3. [js高手之路]深入浅出webpack教程系列9-打包图片(file-loader)用法

    [js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...

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

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

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

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

  6. [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)

    上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽 ...

  7. [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API

    我们接着上文[js高手之路] html5 canvas系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...

  8. [js高手之路] es6系列教程 - 迭代器与生成器详解

    什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...

  9. 原生js由html创建节点,[js高手之路]HTML标签解释成DOM节点的实现方法

    最近在封装一个开源框架,已经写了500行, 已经具备jquery的大多数常用功能,后面还会扩展大量的工具函数和MVVM双向驱动等功能.跟jquery的使用方法完全一样,jquery的选择器,几乎都能支 ...

最新文章

  1. Python3中闭包介绍
  2. jQuery选择器总结
  3. 高效使用Google
  4. c语言递增20,2020-07-20(C语言)数据结构-在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素...
  5. CCCC-GPLT L1-039. 古风排版 团体程序设计天梯赛
  6. [转载]MyISAM InnoDB 区别
  7. Java基础篇:什么是递归?如何用递归?
  8. Atitit 订单处理原理与功能设计attilax总结
  9. PDF在线阅读开发经验(FlexPaper+SWFTools+SaveAsPDFandXPS)
  10. Dev cpp的使用
  11. 韩立刚老师《计算机网络》笔记3
  12. 怎么换证件照底色?分享两款好用的免费制作证件照的软件
  13. 云和恩墨校园猎手招募令
  14. android自适应屏幕方向,Android 屏幕自适应方向尺寸与分辨率-Fun言
  15. [渝粤教育] 中央财经大学 人力资源管理 参考 资料
  16. AT24C02 能读不能写的问题
  17. OpenCV — 人脸识别
  18. 二层基本知识点(一)
  19. 非科班出身的人学习编程不负责任指南
  20. docker启动失败问题之/var/lib/docker/overlay

热门文章

  1. sizeof 数组_简单的一维数组竟然有这么多坑?
  2. kmeans 算法_kmeans优化算法:二分Kmeans聚类算法
  3. bat入门-----依据ping状态判断ip【第一天】
  4. 量化框架zipline--分钟回测改写
  5. 表变量与临时表的优缺点
  6. [LeetCode-JAVA] The Skyline Problem
  7. 在MFC的picture控件中如何显示Mat图
  8. uni-app 实现递增递减(js)
  9. hive 结构metastone_基于MySQL元数据的Hive的安装和简单测试
  10. git 未能顺利结束(退出码1)