话说很多同学在刚学Javascript的时候,总会遇到this这个关键字,而它在不同的场景里面,经常指向不同的对象,一下子很容易把初学者给绕晕了。其实理解了其原理,就很清晰的知道this指向了具体的哪个对象。

废话少说,直入主题!

this关键字一般有四种用法,总结如下表格

函数 挂在全局global对象,浏览器即window对象
方法 作为某个对象的方法,一般都指向该对象
new 构造函数 new 首字母大写的函数(),this就会绑定到这个新生成到对象
apply / call应用 this绑定到这两个方法到第一个参数thisobj上

有了上面表格到总结,接下来我们来看每个到例子是怎么样到。

一  函数

var name ='kk';function test(){    console.log('Hello, I am', this);    console.log('name:', this.name);}

test();

这其实是一个全局函数, 挂载在Window对象下面,作为Window对象的一个方法。所以我们可以直接通过函数名test()来调用,或者Window.test()来调用,这自然而然的this关键字指向了 Window对象。而name ='kk'是一个全局变量,相当于window.name = 'kk';而调用这个test方法到父作用域是window对象。
output:

Hello, I am Window
name: kk

二 方法

var name = 'kk';
var obj = {name : 'dd',test: function(){    console.log('Hello, i am ', this.name);}}obj.test();name = 'ff';var newtest = obj.test;newtest();

obj.test(); 执行了obj对象的方法,故在方法test指向时,this指向obj对象,当然输出应该是obj.nam,即dd。

var newtest = obj.test; 代表将obj的test方法赋给newtest对象,一个打印当前对象的名字的方法,那么newtest(),执行的时候应该搞清楚是在Window作用域下执行的,而不是代表在执行obj.test()方法。所以打印出window.name,而window.name被替换成最新的值 'ff'。

output:
Hello, i am dd
Hello, i am ff

小坑:试着将var newtest = obj.test; newtest(); 换成var newtest = obj.test(); newtest(); 对比之下,就只是多了个(),但是结果又会怎么样呢? var newtest = obj.test(); 因为多了个(), 会先将执行obj.test();打印出Hello, i am dd, 但是由于test方法没有任何的return对象,所以newtest是undefined,接下来newtest();对一个undefined再加上()去执行,肯定会怎么样?报错error呗。

三 构造函数
new 构造函数,一般使用new 和函数首字母大写,new出一个新对象。

function Test(name){    this.name = name;}var obj1= new Test('Tom');var obj2 = obj1;obj2.name = 'Steve';console.log(obj1.name);

new 出第一个对象Obj1赋值'Tom',而又让Obj2指向Obj1,所以Obj1.name也可以通过obj2.name来更新。
output:

Steve

四 apply / call 应用

var test = function(){
console.log(this);
}
var obj = {name: 'Tom'};
test.apply(obj);

output:

Object{ name: 'Tome'} 即obj对象

apply / call的应用,跟bind有什么不同呢?test.bind(obj); 不会立即执行,需要var excutetest = test.bind(obj);  excutetest(); 来执行方法。

转载于:https://blog.51cto.com/8139266/1835766

Javascript 基础-------this关键字相关推荐

  1. JavaScript基础第01天—编程语言—计算机基础—初始JavaScript—JavaScript注释—JavaScript输入输出语句—变量的使用—数据类型—关键字和保留字

    JavaScript基础第01天 1 - 编程语言 1.1 编程 编程: 就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 计算机程序: 就是计算机所执行的一系列的 ...

  2. javascript基础语法——表达式

    前面的话 一般地,关于javascript基础语法,人们听得比较多的术语是操作符和语句.但是,其实还有一个术语经常使用,却很少被提到,这就是javascript表达式(expression).本文将详 ...

  3. JavaScript基础一

    1.1 javascript简介 Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) J ...

  4. JavaScript基础---语言基础(1)

    写在前面: 通过四篇博客把JS基础中的基础整理一下,方便自己查阅,这些内容对于实际项目开发中也许并不会在意,但是作为JS的语言基础,自觉还是应该熟悉.在完成这三篇博客(JavaScript基础---语 ...

  5. 常见JavaScript基础面试题上(附答案)

    常见JavaScript基础面试题上(附答案) 1.JavaScript有哪些垃圾回收机制? 有以下垃圾回收机制. 标记清除( mark and sweep) 这是 JavaScript最常见的垃圾回 ...

  6. javascript基础语法——词法结构

    前面的话 javascript是一门简单的语言,也是一门复杂的语言.说它简单,是因为学会使用它只需片刻功夫:而说它复杂,是因为要真正掌握它则需要数年时间.实际上,前端工程师很大程度上就是指javasc ...

  7. javascript技术教程蔡敏_程序员都必掌握的前端教程之JavaScript基础教程(上)

    阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到. 本篇文章成哥继续带大家来学习前端教程之JavaScript,网页的动态事件基本上都是靠它来实现的.下面我们就一起来学习内容吧! 01 Ja ...

  8. Javascript基础回顾 之(一) 类型

    本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...

  9. javascript基础教程_JavaScript基础教程(九)对象、类的定义与使用

    对象.类的定义与使用 对象与类是面向对象程序设计语言教学过程中不可避免需要讲解的内容之一.很多人将两者混为一谈,简单认为对象就是类,类就是对象.实际上深入分析的话,对象与类的区别还是较为明显的.本文主 ...

最新文章

  1. 中文自然语言处理数据集:ChineseNLPCorpus(附链接)
  2. pytorch 加载不对齐预训练
  3. 纸牌游戏10点半c语言,python10点半纸牌游戏_【Python】Python编的纸牌游戏
  4. 只能输入正整数 以及常用的正则表达式
  5. java map统计学生名单_Java含自己的总结:集合,学生,遍历,ArrayList,Set,Map,泛型,班级,发牌—诗书画唱...
  6. HttpClient实现客户端与服务器的通信
  7. 简述python爬虫_python爬虫入门篇了解
  8. js获取数组前n项的和
  9. Mybatis中出现java.sql.SQLException: 无效的列类型: 1111
  10. 探讨SQL Server 2005的评价函数
  11. SVN汉化包安装方法
  12. vc运行库各版本下载
  13. 图像分割之(五)活动轮廓模型之Snake模型简介
  14. Excel中计算加权平均数
  15. 永远不要把自己置于一种不得不失去颜面而后退,同时不得不冒险而前进的境地。
  16. 计算机主机中包,百度地图脱机包最终可以在计算机上导入
  17. python车牌识别系统抬杆_昆明车牌识别自动抬杆系统
  18. python人机交互界面设计_[译]学习IPython进行交互式计算和数据可视化(五)
  19. 李宏毅老师《机器学习》课程笔记-3卷积神经网络
  20. SCAU 2022 Java综合性实验

热门文章

  1. mybatis对mysql if函数_Mybatis使用mysql函数if出现错误
  2. i2c hid 触摸板不能用_I2C 总线协议初探 - STM32 I2C 接口外设学习笔记
  3. oracle负载均衡方案,Oracle负载均衡配置代码
  4. vuejs和html语言一样么,vue和vue.js有区别吗?
  5. swift和python语法区别_Swift 基本语法
  6. 2021年信号与系统期中考试的补测试题
  7. 图像修复中的方法--AI智能.
  8. 看看那些来自电路造型挑战赛中的作品
  9. 怎么解决哈希冲突_从生日悖论谈哈希碰撞
  10. python中calendar怎么用_Python时间模块datetime、time、calendar的使用方法