资讯专栏INFORMATION COLUMN

函数调用模式中的this

itvincent / 922人阅读

摘要:尤其是函数调用模式更是一头雾水。中的有一个特性就是运行期绑定不包括箭头函数,所以可以是全局对象,当前对象或者任意对象,这完全取决于函数的调用方式函数调用模式中的以此模式调用函数时,会被绑定到全局对象。

之前读语言精粹的时候一直对函数的调用的理解是模模糊糊,一知半解。尤其是 函数调用模式 更是一头雾水。终于今天让我遇到这个问题了,总算是对函数调用模式this 有了一个相对来说比较清楚的认识。

javascrit中的this有一个特性就是:运行期绑定(不包括箭头函数),所以this可以是 全局对象当前对象 或者 任意对象这完全取决于函数的调用方式

函数调用模式中的this

以此模式调用函数时, this 会被绑定到全局对象。这是一个语言上的设计错误。举个栗子:

var Chat = {
    func1 () {
        //...
        this.func2()    //这里会报错: func2 is not a function
     }
    func2 () {
        //...
    }
}

出现这种错误的原因就是,this 没有绑定到Chat对象上,而是绑定到全局对象上了。导致,方法不能利用内部函数。

解决方法一:

var Chat = {
    func1 () {
        //定义一个变量that赋值给this,那么内部函数可以通过that访问到this
        var that = this      
        this.func2()    
     }
    func2 () {
        //...
    }
}

解决方法二:

var Chat = {
    func1 (){
        Chat.func2()      //谁的方法,谁调用  
     }
    func2 () {
        //...
    }
}
箭头函数中的this
function taskA() {
  this.name = "hello"

  var fn = function() {
    console.log(this)
    console.log(this.name)
  }

  var arrow_fn = () => {
    console.log(this)
    console.log(this.name)
  }
  fn()
  arrow_fn()
}
taskA()

首先根据 词法作用域 ,由于它本身没有this,于是便向上查找this。接下来,发现taskA是有this的,于是便直接继承了taskA的作用域。

那么,问题来了:taskA的this又是什么呢?
taskA是一个普通函数,普通函数的this是在运行时决定的,由于我们是直接调用taskA的,即taskA(),所以其this便是window。所以,在这个例子中,arrow_fn中的this是window

所以,综上所述:箭头函数中的this是定义的时候就决定的。另外,还需要注意的一点是:它的 this 指向是不可改变的

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

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

相关文章

  • JavaScript 中this在不同调用模式中的差异

    摘要:的值为以此模式调用函数时,被绑定到全局对象。在传统的面向类的语言中,构造函数是类中的一些特殊方法,使用初始化类时会调用类中的构造函数。包括内置对象函数在内的所有函数都可以用来调用,这种函数调用被称为构造函数调用。 调用一个函数会暂停当前函数的执行,传递控制权和参数给新函数。除了声明时定义的形式参数,每个函数还接受两个附加参数: this 和 arguments。参数 this 的值取决...

    wuyangnju 评论0 收藏0
  • JavaScript中的this

    摘要:作为构造函数何为构造函数所谓构造函数就是用来对象的函数,像等都是全局定义的构造函数。正在跑步正在说话正在跑步正在说话如上,如果函数作为构造函数用,那么其中的就代表它即将出来的对象。 前言 总括:详解JavaScript中的this的一篇总结,不懂this这个难点,很多时候会造成一些困扰,写出一些bug不知如何收场,所以一起来写bug吧,不对,一起来写代码吧。 原文地址:JavaScr...

    SimpleTriangle 评论0 收藏0
  • 匿名函数以及闭包内部this指向(函数调用模式的问题)

    摘要:网上看到一句话,匿名函数的执行是具有全局性的,那怎么具有的全局性呢闭包内部的指向是,为什么指向了呢下面通过函数调用模式和部分案例分析了为什么确实如此函数调用的模式方法调用模式和函数调用模式如果一个函数被设置为一个对象的属性,则称它为一个方法 网上看到一句话,匿名函数的执行是具有全局性的,那怎么具有的全局性呢?闭包内部this的指向是window,为什么指向了window呢?下面通过js...

    yy736044583 评论0 收藏0
  • 匿名函数以及闭包内部this指向(函数调用模式的问题)

    摘要:网上看到一句话,匿名函数的执行是具有全局性的,那怎么具有的全局性呢闭包内部的指向是,为什么指向了呢下面通过函数调用模式和部分案例分析了为什么确实如此函数调用的模式方法调用模式和函数调用模式如果一个函数被设置为一个对象的属性,则称它为一个方法 网上看到一句话,匿名函数的执行是具有全局性的,那怎么具有的全局性呢?闭包内部this的指向是window,为什么指向了window呢?下面通过js...

    _Zhao 评论0 收藏0
  • 匿名函数以及闭包内部this指向(函数调用模式的问题)

    摘要:网上看到一句话,匿名函数的执行是具有全局性的,那怎么具有的全局性呢闭包内部的指向是,为什么指向了呢下面通过函数调用模式和部分案例分析了为什么确实如此函数调用的模式方法调用模式和函数调用模式如果一个函数被设置为一个对象的属性,则称它为一个方法 网上看到一句话,匿名函数的执行是具有全局性的,那怎么具有的全局性呢?闭包内部this的指向是window,为什么指向了window呢?下面通过js...

    remcarpediem 评论0 收藏0

发表评论

0条评论

itvincent

|高级讲师

TA的文章

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