this是JavaScript中功能最强大的关键字之一。 如果对JavaScript的关键字this理解不够深刻,有时候会掉入意想不到的坑。
一、this概述
this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象。但是在JavaScript中,由于JavaScript的动态性(解释执行,当然也有简单的预编译过程),this的指向在运行时才确定。这个特性在给我们带来迷惑的同时,也带来了编程上的自由和灵活,结合apply、call、bind方法,可以使JS变得异常强大。this是Javascript语言的一个关键字,它代表函数运行时自动生成的一个内部对象,一般在函数内部使用。
① this的值通常是由所在函数的执行环境决定,也就是说要看函数是如何被调用的;
② 同一个函数每一次调用,this都可能指向不同的对象;
this是JS对象中的一个特殊指针,它的指向根据环境不同而会发生改变。
function的this永远指向调用它的对象
两点说明:
① 在全局作用域中(所有函数外)出现的this,指全局对象。在浏览器中就是window对象。
② 在函数内部出现的this,指什么要看这个this所在的函数的被调用方式。
不论这个this出现在什么样的函数中,层次有多深,结构多复杂,只要看直接包含它的函数即可。
二、this指向用法分类详解
this指向小结预览:
① 谁调用或者哪个对象调用this所在的函数,this就指向谁。
② 如果有嵌套调用,则其值会被绑定到调用this所在函数的最近的父对象。不论这个this出现在什么样的函数中,层次有多深,结构多复杂,只要看直接包含它的函数即可。
简而言之,就是function的this永远指向直接调用它的对象。
1、对象构造函数中的this (new关键字构造对象)
当使用new关键字构建一个新的对象,this会绑定到这个新对象。
2、 普通函数中的this
作为普通函数直接调用时,this指向window对象.
this指向:谁调用或者哪个对象调用this所在的函数,this就指向谁。
3、onclick(this)中的this指向
对于一个onclick属性,它为它所属的HTML元素所拥有,this指向该HTML元素。
4、定时器setTimeout中的this指向
定时器中的this指向window对象。因为定时器就是全局函数,由window调用。
5、使用apply、call 或 bind 方法时this的指向
使用apply 、call 或 bind方法时,this指向所传递的对象。
apply()的参数为空时,默认调用全局对象window。
6、ES6 箭头函数和 this
箭头函数的特征就是:定义在哪,this 就指向那。
箭头函数的特征就是:定义在哪,this 就指向那。即箭头函数定义在一个对象里,那箭头函数里的 this 就指向该对象。
三、总结
① 谁调用或者哪个对象调用 this所在的函数,this就指向谁。 如果有嵌套调用,则其值会被绑定到调用this所在函数的最近的父对象 。不论这个this出现在什么样的函数中,层次有多深,结构多复杂,只要看直接包含它的函数即可。
② “this” always refers to the “owner” of the function we’re executing。
③ this通常指向的是我们正在执行的函数本身,或者是,指向该函数所属的对象。
④ this是Javascript语言的一个关键字,它代表函数运行时自动生成的一个内部对象,只能在函数内部使用。