前言

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的用法,你掌握了么?

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

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

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

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

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

  2. (转)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. [No000069]Javascript中this关键字详解

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

随机推荐

  1. 通过Shell脚本将VSS项目批量创建并且提交迁移至Gitlab

    脚本运行环境:Git Bash 系统环境:Windows 10 Pro 1709 VSS版本:Microsoft Visual SourceSafe 2005 我的VSS工作目录结构如下: D:\wo ...

  2. 字段like多个条件(or关系)简写

    字段 like ‘匹配串1’or 字段 like ‘匹配串2’or ... 有如下简写方式 oracle: select  * from tablex where REGEXP_LIKE(字段名, ' ...

  3. laravel中ajax,post传值问题

    //laravel中有CSRF保护 不加的话会出现419错误$.ajax({ url: '/admin/user/'+id, type: "POST", data: {'_toke ...

  4. appium+夜神+python3 环境配置

    先感慨一下真的心累啊,踩了好多坑,断断续续四天终于把环境彻底搭建完了,由于之前看的网上的帖子都不是很全而且还带坑,决定自己写一篇综述,作为笔记. 一,首先是安装需要的环境: 需要用到的软件: 1. j ...

  5. python调用远程chromedriver.exe、selenium抓包方法

    本地python示例代码: from selenium import webdriver driver = webdriver.Remote(command_executor='http://192. ...

  6. mysql批量查询

    一般批量查询的时候都是in关键字,但是在数据量大的时候,效率低下. 这个时候我们就可以考虑使用union . xml 核心代码 <select id="selectList" ...

  7. eclipse中出现An internal error occurred during: "Initializing Java Tooling"

    关于这个问题我查了一下,就是删除.projct文件夹下的文件. 自己试了一下,这个可以及解决问题可是会出现新的问题. 1.SVN关联没了,这样做你的svn信息都没了,项目还要重新导一遍 2.出现了新的 ...

  8. chrome浏览器导出文件提示病毒扫描失败

    转自https://zhidao.baidu.com/question/758059392558639324.html 1.windows+R,打开运行 2.输入regedit.exe,确定,打开注册 ...

  9. re模块的应用

    import re # 正则表达式中的转义 : # '\(' 表示匹配小括号 # [()+*?/$.] 在字符组中一些特殊的字符会现出原形 # 所有的 \w \d \s(\n,\t, ) \W \D ...

  10. Ember.js 看法,精辟

    https://ruby-china.org/topics/31451#reply43 都是大牛,或许还是vue适合小白!架不住人多啊!一个非常优秀的产品,客户百十号人,如何发展! 46楼的感想如下, ...