乐趣区

关于javascript:一文弄懂-this-的前世今生

JavaScript 的 this 关键字大家都不生疏,依据 this 所在的不同的运行环境,会产生一些容易让人困惑的体现和差别,在没有认真理解 this 之前,我对它的了解十分的僵硬和全面,心愿大家浏览完这篇内容可能分明的明确 this 的用处。

this 的由来

让咱们看一下这个栗子:

var name = 'MyWindow'

function SayHi() {console.log('Hi, My name is' + name + '.')
}

var MyJavaScript = {
  name: 'MyJavaScript',
  sayHi: SayHi,
}

SayHi() // Hi, My name is MyWindow.
MyJavaScript.sayHi() // Hi, My name is MyWindow.

能够看到,当咱们想试图输入 Hi, My name is MyJavaScript. 的时候,还是输入了 window。因为SayHi 函数里输入的 name 变量值必然是沿着以后执行环境的作用域链查找的,而 SayHi 函数被调用时会创立出一个本人的执行环境,依照作用域嵌套程序,SayHi被嵌套在全局执行环境中,在函数外部查找 name 变量则会找到外层的全局作用域中的 name 变量,所以不论如何调用都会输入window

那想一想,当咱们调用 MyJavaScript.sayHi() 时要如何精确输入 MyJavaScript 对象的 name 属性呢?

噔噔蹬蹬,this机制就此诞生了!!(自带 bgm)

this被用来指向 函数真正的运行环境

让咱们改写一下 SayHi 办法:

var name = 'MyWindow'

function SayHi() {
  // 此处发生变化
  console.log('Hi, My name is' + this.name + '.')
}

var MyJavaScript = {
  name: 'MyJavaScript',
  sayHi: SayHi,
}

SayHi() // Hi, My name is MyWindow.
MyJavaScript.sayHi() // Hi, My name is MyJavaScript.

如上图,当咱们将 name 批改为 this.name 后,sayHi函数当在作为 MyJavaScript 对象的某一属性被调用时,精确的输入了以后函数的调用者 MyJavaScript 对象的 name 属性值。

由此咱们能够得悉,this对象的作用就是当函数在不同的执行环境下被调用,让咱们可能失去 真正调用函数的对象。与函数定义在哪里或者函数作用域无关,只关怀函数的调用形式。

========================= 伪装富丽的分割线 ===========================

以上就是 this 对象的前世,上面会整顿一些与 this 对象相干的必懂知识点,供大家查阅。

一些必懂的知识点

this 是什么

thisJavaScript 关键字,在非严格模式下,它总是指向一个对象,而具体指向哪个对象是依据函数运行时所在的执行环境动静绑定的。

为什么须要 this

因为函数能够在不同的运行环境中执行,本身调用或作为办法调用,为了失去以后函数真正运行时的所在执行环境,即函数执行时 真正的调用对象 this 机制就此诞生了。

this 有什么作用

(同上)指向函数真正的调用对象

this 的指向

简略调用

全局环境下 this 默认指向 全局对象 ,严格模式下则为undefined,浏览器中则为window 对象。

e.g. func() => this默认指向 全局对象 => window(浏览器下)。

作为对象的办法调用

this指向由调用形式决定,在函数执行时确定。

e.g. obj.func() => this指向具体调用对象 => obj

这里能够了解为 obj.f1() 咱们是通过该对象 obj 找到 f1 函数的,则它运行时所在环境就是 obj 环境,this指向obj

作为构造函数

当一个函数用作构造函数时(应用 new 关键字),它的 this 被绑定到正在结构的新对象。

this指向取决于函数返回的对象(默认无初始化值 => undefined),在类上下文中则是取决于类的构造函数返回对象(默认返回类中定义的所有属性和办法,不包含静态方法)。

函数上下文默认 this

无初始化值

手动增加 this 属性

函数上下文手动返回

类上下文默认 this

类上下文构造函数手动返回

是不是想返回了??快完结了啊,再保持一下 ????

箭头函数

咱们晓得一般函数的 this 指向在函数执行时确定,由函数的调用形式决定。

而在 ES6 的箭头函数中,this指向在函数定义时就确定了,永远指向该函数申明时所在的环境对象,任何其余形式都无奈批改 this 的指向。

静态方法

因为 this 对象代表调用这个函数的对象,而静态方法是属于类的而不是调用对象,静态方法胜利加载后,调用对象可能还不存在。因而在静态方法中是找不到 this 对象的值的。

匿名函数

匿名函数中 this 的指向也是仍旧由函数调用形式决定。

foo作为 objA 的办法被调用,this指向objA

foo被指向 objA.foo 所指向的匿名函数,当 foo 被简略调用时,this就指向了全局对象。

setTimeout 和 setInterval

当应用 setTimeoutsetInterval时,回调函数中的 this 默认指向 window 对象,因为 setTimeoutsetIntervalwindow 对象提供的办法。

可见,setTimeout中输入的是 window 对象上的 count 属性。

真的真的第 99 步了,坚持到底啊 ????

扭转 this 指向的几种办法和区别

call

apply

call 和 apply 的区别

call的参数是间接放进去的,第二第三第 n 个参数全都用逗号分隔。

apply的第二个参数接管的是一个数组,对应传递给被绑定的函数。

bind

bind用法和 call 统一,然而 bind 返回的是被绑定的函数,须要做一次额定的手动调用。

到此本文就完结啦,能保持看完的小伙伴们必成大才!感激浏览,欢送点赞 ????????

退出移动版