JavaScript中的this详解

时间:2021-08-31 22:57:08

前言

this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢?

下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助!

this指向的规律

this指向的规律往往与函数调用的方式息息相关;this指向的情况,取决于函数调用的方法有哪些。

我们来看一下姜浩五大定律:

姜浩五大定律:

①通过函数名()直接调用:this指向window;
②通过对象.函数名()调用的:this指向这个对象;
③函数作为数组的一个元素,通过数组下标调用的:this指向这个数组;
④函数作为window内置函数的回调函数调用:this指向window,setTimeout,setInterval等……;
⑤函数作为构造函数,用new关键字调用时:this指向新new出的对象。

对于this指向谁,我们记住一句就行:谁最终调用函数,this就指向谁!

因为,

①this指向的永远只可能是对象!
②this指向谁,永远不取决于this写在哪!而是取决于函数在哪调用!!!
③this指向的对象,我们称之为函数的上下文context,也叫函数的调用者。

多说无益,理论不如实践,大家一起来看下面的代码:

HTML代码:

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript中的this详解</title>
</head> <body>
<div id="div">1111</div>
</body>
</html>

JS代码:

 function func(){
console.log(this);
} //①通过函数名()直接调用:this指向window
func(); //②通过对象.函数名()调用的:this指向这个对象
//狭义对象
var obj = {
name:"obj",
func1:func
}; obj.func1();//this--->obj //广义对象
document.getElementById("div").onclick = function(){
this.style.backgroundColor = "red";
};//this--->div //③函数作为数组的一个元素,通过数组下标调用的:this指向这个数组
var arr = [func,1,2,3];
arr[0](); //this--->数组arr //④函数作为window内置函数的回调函数调用:this指向window
setTimeout(func,1000);
//setInterval(func,1000); //⑤函数作为构造函数,用new关键字调用时:this指向新new出的对象
var obj = new func();//this--->new出的新obj

看过代码之后,对于this的指向及用法,你了解透彻了么?

下面我们来做个小练习巩固一下this指向的五大定律。

看代码↓↓↓:

HTML代码:

 1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8">
5 <title>JavaScript中的this详解</title>
6 </head>
7
8 <body>
9 <div id="div">1111</div>
10 </body>
11 </html>

JS代码:

 var obj1 = {
name:'obj1',
arr:[setTimeout(func,3000),1,2,3]
}
document.getElementById("div").onclick = obj1.arr[0];
//函数最终调用者:setTimeout,符合规律⑤ this--->window var obj2 = {
name:'obj1',
arr:[func,1,2,3]
}
document.getElementById("div").onclick = obj2.arr[0]();
//函数最终调用者:数组下标,符合规律③ this--->arr var obj3 = {
name:'obj1',
arr:[{name:'arrObj',fun:func},1,2,3]
}
document.getElementById("div").onclick = obj3.arr[0].fun();
//函数最终调用者:{name:'arrObj',fun:func},符合规律② this--->obj

this的用法,你掌握了么?

今天的内容就先分享到这里,希望可以帮到你~如有问题,欢迎留言评论,大家一起交流,一起进步!

JavaScript中的this详解

作者:夕照希望
出处:http://www.cnblogs.com/hope666/ 

JavaScript中的this详解的更多相关文章

  1. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  2. &lpar;转&rpar;javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  3. 【JavaScript中的this详解】

    前言 this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢? 下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助! this指向的 ...

  4. Javascript中prototype属性详解 (存)

    Javascript中prototype属性详解   在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...

  5. JavaScript 中 this 的详解

    this 的指向 this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑.在实际应用中,this 的指向大致可以分为以下四种情况. 原文作者:林鑫,作者博客:http ...

  6. JavaScript中的arguments详解

    1. arguments arguments不是真正的数组,它是一个实参对象,每个实参对象都包含以数字为索引的一组元素以及length属性. (function () { console.log(ar ...

  7. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

  8. Javascript中prototype属性详解

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  9. &lbrack;No000069&rsqb;Javascript中this关键字详解

    Quiz 请看下面的代码,最后alert出来的是什么呢?(chrome下按F12,选择Console直接复制粘贴运行) var name = "Bob"; var nameObj ...

随机推荐

  1. vue学习笔记

    来公司以后就一直在用vue框架,不管是业务代码,还是做vue组件.关于vue有一些点是文档中没有提及的,记录一下以便以后查询- 一.Vue的特点 新一代 Vue.js 框架非常关注如何用极少的外部特性 ...

  2. imx6 android5&period;1 打开 调试串口

    imx6的工板烧录android 5.1的镜像,uboot中能使用debug口,kernel,文件系统中不能使用debug口. 打开kenel和文件系统debug口方法,在uboot的bootargs ...

  3. 转一个distinct用法,很有帮助

    转一个distinct用法,很有帮助 (2011-12-01 15:18:11) 转载▼ 标签: 杂谈 分类: mysql复制 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提 ...

  4. JavaScript DOM-Ready 机制

    IE9开始和其他现代浏览器可以通过绑定DOMContentLoaded事件:IE9之前的的浏览器需要绑定onreadystatechange事件并等待readyState为"complete ...

  5. S&ZeroWidthSpace;Q&ZeroWidthSpace;L&ZeroWidthSpace; &ZeroWidthSpace;S&ZeroWidthSpace;e&ZeroWidthSpace;r&ZeroWidthSpace;v&ZeroWidthSpace;e&ZeroWidthSpace;r&ZeroWidthSpace;中&ZeroWidthSpace;&ZeroWidthSpace;的&ZeroWidthSpace;P&ZeroWidthSpace;W&ZeroWidthSpace;D&ZeroWidthSpace;E&ZeroWidthSpace;N&ZeroWidthSpace;C&ZeroWidthSpace;R&ZeroWidthSpace;Y&ZeroWidthSpace;P&ZeroWidthSpace;T&ZeroWidthSpace;与&ZeroWidthSpace;P&ZeroWidthSpace;W&ZeroWidthSpace;D&ZeroWidthSpace;C&ZeroWidthSpace;O&ZeroWidthSpace;M&ZeroWidthSpace;P&ZeroWidthSpace;A&ZeroWidthSpace;R&ZeroWidthSpace;E&ZeroWidthSpace;函&ZeroWidthSpace;数

    前幾天有個客戶的網站出問題(不是我們開發的),請我們幫他看,主要的問題是他們的網站會員在進行查詢密碼時,會員收到信的時候在密碼的欄位竟然會出現 System.Binary[] 字樣.而我進去資料庫中查 ...

  6. MySQL数据类型:SQL&lowbar;MODE设置不容忽视

    [IT168 技术]SQL_MODE可能是比较容易让开发人员和DBA忽略的一个变量,默认为空.SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作,比如可以将NULL插 ...

  7. 关于java构造函数,静态代码块,构造代码块,和普通代码块相关总结(一)

    构造函数.构造代码块和静态代码块容易混淆,它们的执行条件和执行顺序也常常容易犯迷.这里就针对这些问题说一下我个人的一些理解,顺便对这部分内容做个小结. 一.构造函数 格式:类名(参数1,参数2,-){ ...

  8. 【转】Python之日期与时间处理模块(date和datetime)

    [转]Python之日期与时间处理模块(date和datetime) 本节内容 前言 相关术语的解释 时间的表现形式 time模块 datetime模块 时间格式码 总结 前言 在开发工作中,我们经常 ...

  9. android -------- Data Binding的使用(三)Observable

    解决:databinding 中 ViewModel数据发生改变,View中也要改变(实时更新) BaseObservable 在ViewModel 中可以继承 BaseObservable publ ...

  10. rtp rtcp rtsp sip协议了解方法

    vlc有个串流功能 可以流各种推流 方便拉取. 能够方便抓包查看协议. 1.菜单媒体->流 打开对话框 分别可以选择本地文件 关盘文件 网络流 捕获设备做流化处理. 2. 选择 串流->新 ...