资讯专栏INFORMATION COLUMN

this详解

Youngs / 3544人阅读

摘要:含义既不指向函数本身,也不指向函数的词法作用域。运行时动态绑定,并不是编写绑定,上下文取决于函数调用的各种条件。

含义

既不指向函数本身,也不指向函数的词法作用域。

运行时动态绑定,并不是编写绑定,上下文取决于函数调用的各种条件。

指向取决于函数被调用的位置,也是在函数调用时候发生绑定。

解析 调用栈(可以比拟成函数调用链)

指到达当前执行位置所调用的所有函数

so调用位置(函数被调用的位置,而不是声明位置)就是当前执行函数的前一个调用

</>复制代码

  1. function foo() {
  2. // 当前调用栈 => foo
  3. // 当前调用位置 => global全局作用域
  4. console.log("foo")
  5. bar() // bar调用位置
  6. }
  7. function bar() {
  8. // 当前调用栈 => foo -> bar
  9. // 当前调用位置 foo
  10. console.log("bar")
  11. }
绑定规则

默认 => 独立函数调用

this默认绑定,指向全局对象

隐式 => 是否存在上下文 / 被某个对象拥有或包含

当函数引用存在上下文,this会被隐式绑定到这个上下文对象

对象属性引用链只对调用位置的(上一层 / 最后一层)有效

</>复制代码

  1. function foo() {
  2. return this.a
  3. }
  4. const obj = {
  5. a: "hello",
  6. foo, // 函数引用,当前上下文是obj
  7. }
  8. obj.foo()

显式绑定 => call, apply, bind

硬绑定

</>复制代码

  1. function foo() {
  2. return this.a
  3. }
  4. const obj = {
  5. a: "hello
  6. }
  7. const bar = function() {
  8. foo.call(obj) // 显式的强制绑定
  9. }
  10. setTimeout(bar, 300)
  11. bar.call(window) // 2 => 硬绑定之后this无法再修改

new绑定 => 构造函数调用,实际上并不存在“构造函数”,是对函数的“构造调用”

创建(构造)一个全新的对象

这个对象会被执行[[Prototype]]连接

这个对象会绑定到函数调用的this

如果函数没有返回对象,直接返回这个新对象

注意点

隐式绑定会丢失绑定对象,从而应用默认绑定,分别有以下两种情况。

函数别名 => 引用函数本身,so默认绑定

</>复制代码

  1. function foo() {
  2. return this.a
  3. }
  4. const obj = {
  5. a: "hello",
  6. foo, // 函数引用,当前上下文是obj
  7. }
  8. const a = "on no, this is global"
  9. const bar = obj.foo // 函数别名
  10. bar() // "on no, this is global"

参数传递 => 隐式赋值,同上

</>复制代码

  1. function foo() {
  2. return this.a
  3. }
  4. function doFoo(fn) {
  5. fn() // fn => foo
  6. }
  7. const obj = {
  8. a: "hello",
  9. foo, // 函数引用,当前上下文是obj
  10. }
  11. const a = "on no, this is global"
  12. doFoo(obj.foo) // "on no, this is global"

优先级

显式 > 隐式

new > 隐式

new可以修改显式的this

</>复制代码

  1. function foo(some) {
  2. this.a = some
  3. }
  4. const obj = {}
  5. const bar = foo.bind(obj)
  6. bar(2)
  7. console.log(obj.a) // 2
  8. const baz = new bar(3)
  9. console.log(obj.a) // 2
  10. console.log(baz.a) // 3 => new 修改了this绑定

new中使用硬绑定 => 函数柯理化

</>复制代码

  1. function foo(a, b) {
  2. this.value = a + b
  3. }
  4. const bar = foo.bind(null, "hello ") //这里 this不指定,new时会修改
  5. const baz = new bar("world")
  6. baz.value // "hello world"

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92515.html

相关文章

  • JavaScript 中 this详解

    摘要:作为构造函数调用中没有类,但是可以从构造器中创建对象,并提供了运算符来进行调用该构造器。构造器的外表跟普通函数一样,大部分的函数都可以当做构造器使用。如果构造函数显式的返回一个对象,那么则会指向该对象。 this 的指向 this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑。在实际应用中,this 的指向大致可以分为以下四种情况。 1.作为普通函数调...

    cyrils 评论0 收藏0
  • JavaScript之this对象详解

    摘要:再来看一个小的示例淘宝腾讯淘宝为什么输出的依然是淘宝呢调用的是对象中的方法,方法里面有一个定时器,而定时器的一个参数是这里的指的就是的对象,然后方法里面有调用了,但是定时器中的指的是对象,所以最终调用的是对象中。 1.看前热身 看一段代码 var name = javascript; var obj = { name:js, foo:f...

    Integ 评论0 收藏0
  • 20190725笔记-apply详解

    摘要:语法参数这个对象将替代类里的对象可选在函数运行时使用的值。如果该参数的值为或,则表示不需要传入任何参数。更简单的讲就是将和传入函数执行。 学了那么久前端,对apply、call这两个函数的用法,还不是很掌握。今天看了很多网上的文章,我总结和归纳下用法。 Function.prototype.apply() apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数...

    wzyplus 评论0 收藏0
  • javascript this指针详解

    摘要:但是有一个总的原则,那就是指的是,调用函数的那个对象使用主要分四种情况,讨论下指针的用法和注意事项一纯粹的函数调用这是函数的最通常用法,属于全局性调用,因此就代表全局对象。 this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用,随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对...

    graf 评论0 收藏0
  • javascript this指针详解

    摘要:但是有一个总的原则,那就是指的是,调用函数的那个对象使用主要分四种情况,讨论下指针的用法和注意事项一纯粹的函数调用这是函数的最通常用法,属于全局性调用,因此就代表全局对象。 this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用,随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对...

    AlphaWallet 评论0 收藏0

发表评论

0条评论

Youngs

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<