this是什么?
如果学过面向对象编程语言(比如 C#,Java,C++),那请将你对 this 这个关键词应该是做什么用的先入为主的概念扔到垃圾桶里,JavaScript 的 this 关键词是很不一样,因为 JavaScript 本来就不是一门基于类的面向对象编程语言.
虽然说 ES6 里面 JavaScript 给我们提供了类这个特性给我们用,但它只是一个语法糖,一个基于原型继承的语法糖!!!!
this 既不指向函数自身,也不指函数的词法作用域。如果仅通过this的英文解释,太容易产生误导了。它实际是在函数被调用时才发生的绑定,也就是说this具体指向什么,取决于你是怎么调用的函数.
javaScript this 关键词指的是它所属的对象。
它拥有不同的值,具体取决于它的使用位置:
- 在方法中,this 指的是所有者对象。
- 单独的情况下,this 指的是全局对象。
- 在函数中,this 指的是全局对象。
- 在函数中,严格模式下,this 是 undefined。
- 在事件中,this 指的是接收事件的元素。
- 箭头函数的this是在定义函数时绑定的,不是在执行过程中绑定的
- 像 call() 和 apply() 这样的方法可以将 this 引用到任何对象。
1. 方法中的 this
在对象方法中,this 指的是此方法的“拥有者”。 在下面例子中,this 指的是 person 对象。 person 对象是 fullName 方法的拥有者。
var person = {
firstName: "Tony",
lastName : "ji"
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
2. 单独的this
在单独使用时,拥有者是全局对象,因此 this 指的是全局对象。
在浏览器窗口中,全局对象是 [object Window]
var tony = this;
3. 函数中的 this(默认)
在 JavaScript 函数中,函数的拥有者默认绑定 this。
因此,在函数中,this 指的是全局对象 [object Window]
function myFunction() {
return this;
}
4. 函数中的 this(严格模式)
JavaScript 严格模式不允许默认绑定。
因此,在函数中使用时,在严格模式下,this 是未定义的(undefined)。
"use strict";
function myFunction() {
return this;
}
5. 事件处理程序中的 this
在 HTML 事件处理程序中,this 指的是接收此事件的 HTML 元素
<button onclick="this.style.display='none'">
点击!
</button>
6. 箭头函数的this定义
箭头函数的this是在定义函数时绑定的,不是在执行过程中绑定的。简单的说,函数在定义时,this就继承了定义函数的对象。所以,这会很好的解决匿名函数和setTimeout和setInterval的this指向问题。我们不用再去给其用that变量存储this。
打印的结果:
这就是箭头函数中的this
7. 改变this的指向
call()
第一个参数:this指向
如果要传参,后面依次是参数
function fn(x,y){
console.log(this);
}
var obj = {
name:"zs"
}
fn(1,2);
fn.call(obj,1,2);
apply()
与第一种方法不同的是,用数组的形式表示参数
function fn(x,y){
console.log(this);
}
var obj = {
name:"zs"
}
fn(1,2);
fn.apply(obj,[1,2]);
bind()
bind 只改变this指向 需要手动调用才可执行 ! ! !
function fn(x,y){
console.log(this);
}
var obj = {
name:"zs"
}
fn(1,2);
fn.bind(obj,1,2)();