iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JavaScript this绑定与this指向问题如何解决
  • 861
分享到

JavaScript this绑定与this指向问题如何解决

2023-07-05 06:07:13 861人浏览 八月长安
摘要

本篇内容主要讲解“javascript this绑定与this指向问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript this绑定与this指向问

本篇内容主要讲解“javascript this绑定与this指向问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript this绑定与this指向问题如何解决”吧!

    一、this 绑定

    怎么理解 this?

    其实 this 就是一个指针,它指示的就是当前的一个执行环境,可以用来对当前执行环境进行一些操作。

    MDN 解释:在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定)。this 不能在执行期间被赋值,并且在每次函数被调用时 this 的值也可能会不同。ES5 引入了 bind 方法来设置函数的 this 值,而不用考虑函数如何被调用的。ES2015 引入了箭头函数,箭头函数不提供自身的 this 绑定(this 的值将保持为闭合词法上下文的值)。

    this 是如何绑定的?

    每个函数的 this 是在调用时被绑定的,完全取决于函数的调用位置。我们找到函数的调用位置,然后运用以下四种绑定规则来判断函数的 this 指向。

    默认绑定

    函数的 this 会默认绑定到全局对象 window 上,如果在严格模式中,this 绑定到 undefined。

    function foo (){  console.log(this.a)}let a = 1foo() // 1

    隐式绑定

    调用位置是否有上下文对象,或者被某个对象拥有或包含。

    function foo(){  console.log(this.a)}let obj = {  a: 2,  foo:foo}let a = 1obj.foo(); // 2function foo(){  console.log(this.a)}let obj1 = {  a: 2,  foo: foo}let obj2 = {  a: 3,  obj1: obj1}let a = 1obj2.obj1.foo(); // 2

    显式绑定

    直接改变 this 指向,绑定到另一个执行环境

    function foo(){  console.log(this.a)}let obj = {  a: 1}foo.call(obj)

    new 绑定

    new 出来的函数 this 绑定的是新创建的对象

    function Foo(a){  this.a = a}let bar = new Foo(2)console.log(bar.a) // 2

    this 绑定优先级

    默认绑定的优先级是最低的

    new 绑定 > 显式绑定 > 隐式绑定 > 默认绑定

    显示绑定 VS 隐式绑定

    function foo(){  console.log(this.a)}let obj1 = {  a: 1,  foo: foo}let obj2 = {  a: 2}console.log(obj1.foo()) // 1obj1.foo.call(obj2) // 2

    通过以上代码我们可以看到 显式绑定 的优先级高于 隐式绑定

    显示绑定 VS new 绑定

    function foo(a){  this.a = a}let obj1 = {  foo}let bar = foo.bind(obj1)bar(2)console.log(obj1.a) // 2let bar2 = new bar(3)console.log(obj1.a) // 2console.log(bar2.a) // 3

    new 修改了显示绑定 调用 bar 中的 this,所以 new 绑定的优先级高于显式绑定

    二、this 指向

    判断准则

    第一准则:this 永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。(不包含箭头函数)

    第二准则:无论是否在严格模式下,在全局执行环境中(在任何函数体外部)this 都指向全局对象

    判断顺序

    • 函数是否在 new 中调用,如果是的话 this 绑定的是新创建的对象;

    • 函数是否通过 call、apply、bind 的方式调用,如果是的话 this 绑定的是指定的对象;

    • 函数是否在某个上下文中被调用,如果是的话 this 绑定的是函数调用的上下文;

    • 除此之外 this 绑定的就是全局对象 在严格模式下绑定的是 undefined。

    常见的指向问题

    • 箭头函数没有自己的 this 指针(需要从执行上下文来进行判断)

    三、改变 this 指向

    有四种方式

    • 变量保存 this:将 this 临时保存下来

    • call():使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

    • bind():会有一个返回值,返回值是一个拥有第一个函数作用域的新的函数体

    • apply():调用一个具有给定 this 值的函数,以及以一个数组(或一个类数组对象)的形式提供的参数。

    变量保存 this

    var _this = window;var obj = {    name:"张三",    show:function(){        console.log(this) //obj        console.log(_this) // window    }}obj.show()

    call

    call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

    函数名称.bind(参数1,参数2,a,b,c.....)
        参数1:当前函数的作用域
        参数2:需要传递的参数,参数是一个一个传

    function fn(a,b){    console.log(this,a,b)}document.onclick = functioin(){    fn.call(document,1,2)}

    可以使用 call 来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。

    function Product(name, price) {  this.name = name;  this.price = price;}function Food(name, price) {  Product.call(this, name, price);  this.cateGory = 'food';}function Toy(name, price) {  Product.call(this, name, price);  this.category = 'toy';}var cheese = new Food('feta', 5);var fun = new Toy('robot', 40);

    bind

    bind 创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

    特性就是会有一个返回值,返回值是一个拥有第一个函数作用域的新的函数体

    函数名称.bind(参数1,参数2.....)() // 必须调用一下
        参数1:当前函数的作用域
        参数2:需要传递的参数

    var obj = {    name:"张三",    show:function(val){        console.log(this) //obj  没有修改前        console.log(this,1) // document 1     修改后    }}obj.show().bind(document,1)()

    MDN:ECMAScript 5 引入了 Function.prototype.bind()。调用 f.bind(someObject) 会创建一个与 f 具有相同函数体和作用域的函数,但是在这个新函数中,this 将永久地被绑定到了 bind 的第一个参数,无论这个函数是如何被调用的。

    apply

    apply() 方法调用一个具有给定 this 值的函数,以及以一个数组(或一个类数组对象)的形式提供的参数。

    函数名称.bind(参数1,[参数2,a,b,c.....])
        参数1:当前函数的作用域
        参数2:需要传递的参数   数组

    function fn(a,b,c){    console.log(this,a,b,c)}document.onclick = functioin(){    fn.apply(document,[1,2,3])}

    call ,apply ,bind 三者的区别

    不同点:

    • bind 会有一个返回值,返回值是函数体,因此需要加上 () 才能调用 

    • call,apply 是没有返回值的,当改变函数 this 指向的时候,函数就会执行,不需要加 () 调用

    • call 传递参数的时候是一个一个传递的

    • apply 是传递一个数组或者类数组对象的参数

    到此,相信大家对“JavaScript this绑定与this指向问题如何解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: JavaScript this绑定与this指向问题如何解决

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

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

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

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

    下载Word文档
    猜你喜欢
    • JavaScript this绑定与this指向问题如何解决
      本篇内容主要讲解“JavaScript this绑定与this指向问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript this绑定与this指向问...
      99+
      2023-07-05
    • JavaScriptthis绑定与this指向问题的解析
      目录一、this 绑定怎么理解 this?this 是如何绑定的?this 绑定优先级二、this 指向判断准则判断顺序常见的指向问题三、改变 this 指向有四种方式变量保存 th...
      99+
      2023-02-27
      JavaScript this绑定 JavaScript this指向
    • 如何解决js中this指向问题
      本篇文章给大家分享的是有关如何解决js中this指向问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。JS中this指向问题相信我,只要记住本...
      99+
      2024-04-02
    • 如何理解JavaScript函数this指向问题
      这篇文章给大家介绍如何理解JavaScript函数this指向问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、 函数内 this 的指向这些 this的指向,是当调用函数的时候确定的。 调用方式的不同决...
      99+
      2023-06-21
    • JavaScript中的this指向问题怎么解决
      这篇文章主要介绍了一文搞懂JavaScript中的this指向问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇一文搞懂JavaScript中的this指向问题文章都会有所收获,下面我们一起来看看吧。this的...
      99+
      2023-07-04
    • JavaScript中 this 的绑定指向规则
      目录问题来源this 绑定规则1.默认绑定2.隐式绑定3.显示绑定4.new 绑定5.内置方法6.规则优先级7.规则之外8.实践问题来源 在 js 中,...
      99+
      2024-04-02
    • JavaScript中this指向的问题怎么解决
      今天小编给大家分享一下JavaScript中this指向的问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 默...
      99+
      2023-07-05
    • JavaScript中的this指向问题详解
      前言 相信我,只要记住本文的 7️⃣ 步口诀,就能彻底掌握 JS 中的 this 指向。 先念口诀:箭头函数、new、bind、apply 和 call、欧...
      99+
      2024-04-02
    • JavaScript函数this指向问题详解
      目录一、 函数内 this 的指向1、普通函数2、构造函数3、对象方法4、事件绑定方法5、定时器函数6、立即执行函数二、改变函数内部 this 指向1、call 方法2、apply ...
      99+
      2024-04-02
    • JavaScript中this指向问题怎么理解
      这篇文章主要介绍“JavaScript中this指向问题怎么理解”,在日常操作中,相信很多人在JavaScript中this指向问题怎么理解问题上存在疑惑,小编查阅了各式资料,...
      99+
      2024-04-02
    • JavaScript 中this指向问题案例详解
      总结 全局环境 ➡️ window 普通函数 ➡️ window 或 undefined 构造函数 ...
      99+
      2024-04-02
    • JavaScript函数中this指向问题详解
      this关键字 哪个对象调用函数,函数里面的this指向哪个对象。 **严格模式下:**在全局环境中,this指向的是undefined **非严格模式下:**在全局环境中,thi...
      99+
      2024-04-02
    • 一文详解JavaScript中this指向的问题
      目录1. 默认绑定2. 隐式绑定3. 显示绑定4. new 绑定5. 箭头函数的this6. 优先级7. 总结前提:文章讨论的都是非严格模式下this指向 1. 默认绑定 例子1 ...
      99+
      2023-05-14
      JavaScript this指向 JavaScript this
    • 详解JavaScript原型对象的this指向问题
      目录一、this指向二、修改this指向1、call()方法2、apply()方法总结 一、this指向 构造函数中的this 指向实例对象。那么原型对象this的指向呢? 如下:...
      99+
      2024-04-02
    • JavaScript this指向绑定方式及不适用情况详解
      目录前言问题复现调用位置默认绑定隐式绑定显式绑定new 绑定不适用的情况总结前言 JavaScript 中的 this 指向问题对于 web 前端入行不深的人来说是个比较复杂的问题。...
      99+
      2023-05-15
      JavaScript this指向 JavaScript this绑定方式
    • JavaScript中this指向问题的示例分析
      这篇文章将为大家详细讲解有关JavaScript中this指向问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 箭头函数箭头函数排在第一个是因为它的 this 不会被改变,所以只要当前函数...
      99+
      2023-06-14
    • 一文搞懂JavaScript中的this指向问题
      一、全局环境下的this指向在全局作用域下,this始终指向全局对象window,无论是否是严格模式!congsole.log()完整的写法是window.console.log(),window可以省略,window调用了console....
      99+
      2023-05-14
      javascript
    • vue如何使用axios时解决关于this指向的问题
      这篇文章将为大家详细讲解有关vue如何使用axios时解决关于this指向的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.解决办法在vue中使用axios做网络请...
      99+
      2024-04-02
    • JavaScript this指向绑定方式及不适用情况是什么
      这篇文章主要讲解了“JavaScript this指向绑定方式及不适用情况是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript this指向绑定方式及...
      99+
      2023-07-06
    • JavaScript进阶教程之函数的定义、调用及this指向问题详解
      目录前言一:函数的定义 1.1 命名函数 1.2 匿名函数 1.3 利用 new Function() 声明函数1.4 重要结论&n...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作