iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript中this的绑定你知道几种?
  • 192
分享到

JavaScript中this的绑定你知道几种?

JavaScript this绑定JavaScript this 2023-02-08 12:02:55 192人浏览 独家记忆
摘要

目录执行上下文this到底是什么呢调用位置绑定规则特例面试题执行上下文 我们知道执行上下文分为两种:全局上下文和函数上下文(我的这篇文章对于执行上下文有讲解还对执行上下文和作用域迷糊

执行上下文

我们知道执行上下文分为两种:全局上下文和函数上下文(我的这篇文章对于执行上下文有讲解还对执行上下文和作用域迷糊吗?)。全局上下文只有一个,函数执行上下文是在函数调用的时候创建的。

每个执行上下文都有三个属性:

  • 变量对象
  • 作用域链
  • this

this到底是什么呢

this是在运行时绑定的,并不是在编写时绑定的,它的上下文取决于函数调用时的各种条件。this的绑定和函数声明的位置没有任何的关系,只取决于函数的调用方式。

调用位置

要理解this的绑定过程,首先要理解调用位置。调用位置就是函数的调用的位置(不是声明的位置)。所以我们要先来分析调用栈(也就是执行上下文栈)。我们先来看一段代码。

function baz() {
  console.log("baz")
  bar()
}
function bar() {
  console.log("bar")
  foo()
}
function foo() {
  console.log("foo")
}
baz()

当代码执行到foo(),进入foo的函数体,此时当前的调用栈为:

ECStack = [
    fooContext, // foo
    barContext, // bar
    bazContext, // baz
    globalContext, // 全局
]

通过调用栈我们就可以很清晰的找到函数的调用位置。baz在全局调用,bar在baz里调用,foo在bar里调用。

那函数在执行的时候是如何决定this的绑定对象的呢?

绑定规则

通过绑定规则决定this的绑定对象。

默认绑定

最常用的调用类型:独立函数调用。

function foo(){
    console.log(this.a) // 2
}

var a = 2;
foo()

函数调用的时候,使用了this的默认绑定,因此this指向全局对象。

那么我们怎么知道这里应用了默认绑定呢?可以通过分析调用位置来看看 foo() 是如何调用的。在代码中,foo()是直接使用不带任何修饰的函数引用进行调用的,因此只能使用默认绑定,无法应用其他规则。

所以,在全局环境中调用一个函数,函数内部的this指向的是全局变量window。

隐式绑定

function foo() {
    console.log( this.a );
}

var obj = {
    a: 2,
    foo: foo
};

obj.foo(); // 2

这段代码我们看到foo的声明位置是在全局的,但是它被当做引用属性添加到了obj中。调用位置使用obj上下文引用函数。当foo被调用时候,它是被obj对象所包含的,落脚点指向obj对象。当函数引用有上下文对象时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象。

通过一个对象调用其内部的一个方法,该方法的执行上下文中的this指向对象本身

我们看个特殊的例子

function foo() {
  console.log(this.a)
}

var obj = {
  a: 2,
  foo
}

var bar = obj.foo
var a = "mick"
bar() // mick

bar是obj.foo的一个引用,但是实际上,它引用的是foo函数本身,因此此时bar()其实是一个不带任何修饰的函数调用,因此应用了默认绑定。

我们再看另一种情况

function foo() {
  console.log(this.a)
}

function doFoo(fn) {
  fn()
}

var obj = {
  a: 2,
  foo
}

var a = "mick"

doFoo(obj.foo) // mick

嵌套函数中的this 不会从外层函数中继承。this永远指向最后调用它的那个对象

显示绑定

可以使用call、apply或bind方法。如果对这三个方法的实现原理感兴趣可以看看这篇手写call、apply、bind

function foo() {
  console.log(this.a)
}
var obj = {
  a: 2
}

foo.call(obj) // 2

通过call方法,可以在调用foo时候,强制把它的this绑定到obj上。

new绑定

这里我们先说一下new来调用函数会发生哪些事情

  • 创建一个全新的对象
  • 这个新对象会被执行[[原型]]链接
  • 这个新对象会绑定到函数调用的this
  • 如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。
function foo(a){
    this.a = a
}
var bar = new foo(2)
console.log(bar.a)

使用new来调用foo时,我们会构造一个新对象并把它绑定到foo调用中的this上。

特例

function foo() {
  console.log(this.a)
}

var a = 2
var o = { a: 3, foo: foo }
var p = { a: 4 }

o.foo() // 3
;(p.foo = o.foo)() // 2

赋值表达式p.foo = o.foo的返回值是目标函数的引用,因此调用位置是foo()而不是p.foo()或者o.foo()。所以这里是默认绑定。

面试

下面我们看个面试题吧

var name = 'window'
var person1 = {
  name: 'person1',
  foo1: function () {
    console.log(this.name)
  },
  foo2: () => console.log(this.name),
  foo3: function () {
    return function () {
      console.log(this.name)
    }
  },
  foo4: function () {
    return () => {
      console.log(this.name)
    }
  }
}
var person2 = { name: 'person2' }

person1.foo1()
person1.foo1.call(person2)

person1.foo2()
person1.foo2.call(person2)

person1.foo3()()
person1.foo3.call(person2)()
person1.foo3().call(person2)

person1.foo4()()
person1.foo4.call(person2)()
person1.foo4().call(person2)

我们一个个来解析一下。

  • person.foo1()这个属于隐式绑定,foo1的this绑定到了person,所以打印person1
  • person1.foo1.call(person2)显示绑定,foo1的this通过call改变了this,指向了person,所以打印person2
  • person.foo2()因为foo2是箭头函数,所以它的this指向是它上一层this的指向也就是window,window
  • person1.foo2.call(person2)和上面一条同样的道理,也是window
  • person1.foo3()()内部返回了一个函数,其实是一个函数的引用,此时this应该指向window,所以打印window
  • person1.foo3.call(person2)()通过call只是改变了foo3的this指向,和返回的函数没有什么关系,所以this还是指向window,打印window
  • person1.foo3().call(person2)通过call改变了foo3内部返回函数的this指向,所以打印person2
  • person1.foo4()()返回的是一个箭头函数,箭头函数的this是它上一层函数内部this的指向,所以也就是foo4this的指向,由于foo4被person1包含并调用,所以this指向person1,打印person1
  • person1.foo4.call(person2)(),此时foo4内部的this通过call改变成了person2,所以打印person
  • person1.foo4().call(person2)这个和person1.foo4()是一样的道理,打印person1

简单的谈了谈this的绑定,欢迎留言你的问题,大家一起学习一起进步!!!

到此这篇关于javascript中this的绑定你知道几种?的文章就介绍到这了,更多相关JavaScript this绑定内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript中this的绑定你知道几种?

本文链接: https://www.lsjlt.com/news/195160.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中this的绑定你知道几种?
    目录执行上下文this到底是什么呢调用位置绑定规则特例面试题执行上下文 我们知道执行上下文分为两种:全局上下文和函数上下文(我的这篇文章对于执行上下文有讲解还对执行上下文和作用域迷糊...
    99+
    2023-02-08
    JavaScript this绑定 JavaScript this
  • JavaScript中this有几种绑定规则
    这篇“JavaScript中this有几种绑定规则”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2022-10-19
  • 异步编程的几种方式,你知道几种?
    异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间。比如:「发送短信、邮件、异步更新等」,这些都是典型的可以通过异步实现的场景。异步的8种实现方式 1、线程Thread...
    99+
    2023-08-15
  • Python 中快的循环方式,你知道几种?
    大家好,我是 somenzz,今天我们来研究一下 Python 中最快的循环方式。各种姿势比如说有一个简单的任务,就是从 1 累加到 1 亿,我们至少可以有 7 种方法来实现,列举如下:1、while 循环def while_loop(n=...
    99+
    2023-05-14
    Python 生成器 循环方式
  • MySQL中复制表的方式你知道几种
    mysql 想必大家比较熟悉了, 我们常见的crud  sql 想必大家也是手到拈来。 但是我在今儿上数据库课的时候,我好像连mysql中复制表的基础写法 都不会。 可能工作中不常用,但作为基础 还是想写出来分享给大家。 这里 我介绍四种常...
    99+
    2023-09-05
    mysql 数据库 sql
  • 你知道哪几种MYSQL的连接查询
    前言 查询信息的来源如果来自多张表,则必须对这些表进行连接查询。连接是把不同表的记录连到一起的最普遍的方法,通过连接查询可将多个表作为一个表进行处理。连接查询分为内连接和外连接。 一...
    99+
    2022-11-12
  • PHP 生成随机数的 5 种方式,你知道几种
    我知道五种PHP生成随机数的方式:1. 使用rand()函数:rand()函数可以生成一个指定范围内的随机整数。例如,生成1到10之...
    99+
    2023-09-21
    PHP
  • 你可能不知道的JavaScript之this指向详解
    目录前言默认绑定,全局对象点石成金,隐式绑定隐式绑定丢失指腹为婚,显式绑定内有乾坤,new 绑定军令如山,箭头函数this 绑定优先级总结相关文献引用链接前言 JavaScript ...
    99+
    2022-11-13
  • 详解JavaScript中的this硬绑定
    目录一、this显示绑定二、硬绑定一、this显示绑定 this显示绑定,顾名思义,它有别于this的隐式绑定,而隐式绑定必须要求一个对象内部包含一个指向某个函数的属性(或者某个对象...
    99+
    2022-11-13
  • Spring注解@Qualifier的详细用法你知道几种
    环境:springboot2.3.10 一般使用在项目中使用@Qualifier来限定注入的Bean。 由于项目中我习惯用@Resource注解,所以这里先对@Autowired和@...
    99+
    2022-11-12
  • vue组件间传值的方法你知道几种
    目录一丶父子组件传值二丶子父组件传值三丶兄弟组件传值四丶$parent /$children与ref总结一丶父子组件传值 先在父组件中给子组件的自定义属性绑定一个 父组件的变量 &l...
    99+
    2022-11-13
  • java 导出到excel的几种方式你要知道
    java导出excel常用的方式使用poi apache开源方式导入导出,很多公司自己研发导出组件对于常用的导入导出其实都使用开源组件。 介绍常用的excel导出方式: 1,poi 方式 上图一个我之前写的很老的导出,代码比较麻烦,但是也是...
    99+
    2023-09-01
    java apache 开发语言
  • C/C++的各种字符串函数你知道几个
    目录一、strrchr参数 返回值示例输出二、atoi参数 返回值示例输出三、strcat参数 返回值示例输出四、strstr参数返回值示例输出五、st...
    99+
    2022-11-13
  • JavaScript中 this 的绑定指向规则
    目录问题来源this 绑定规则1.默认绑定2.隐式绑定3.显示绑定4.new 绑定5.内置方法6.规则优先级7.规则之外8.实践问题来源 在 js 中,...
    99+
    2022-11-13
  • JavaScript 中的 this 绑定规则详解
    目录前言1. 关于 this 的简单介绍2. 为什么使用 this?3. 关于this 的常见的误解4. this 的绑定规则4.1 默认绑定4.2 隐式绑定4.3 显式绑定4.4 ...
    99+
    2023-02-14
    JavaScript中的this绑定规则 JavaScript中的this关键字 JS中this的4种绑定规则
  • HTTP重定向的最佳实践——你知道几个?
    在Web开发中,HTTP重定向是一个非常常见的技术。它可以把一个URL重定向到另一个URL,这对于网站的SEO和用户体验都非常重要。在本文中,我们将介绍HTTP重定向的最佳实践,以及一些代码演示。 使用301重定向 在HTTP重定向中...
    99+
    2023-10-24
    javascript http 重定向
  • Windows上Java大数据框架的选择,你知道几种?
    随着大数据技术的快速发展,越来越多的企业开始尝试将大数据技术应用到自己的业务中。在Java领域中,有很多优秀的大数据框架,比如Hadoop、Spark、Flink等。本文将为大家介绍几种在Windows上使用Java大数据框架的选择,帮助...
    99+
    2023-10-09
    大数据 windows 框架
  • JavaScript中this的绑定规则是怎样的
    JavaScript中this的绑定规则是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。对于 JavaScript 新手来说,this ...
    99+
    2022-10-19
  • 一文搞懂JavaScript中的this绑定规则
    目录前言  this四大绑定规则一.默认绑定二.隐式绑定三.new绑定四.显示绑定绑定规则优先级面试题题1题2题3题4前言  首先我们来看一个示例。定义...
    99+
    2022-11-13
  • JavaScript中this绑定规则的示例分析
    这篇文章主要介绍JavaScript中this绑定规则的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、this 的绑定规则this 一共有 4 中绑定规则,接下来一一介绍...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作