JS中call(),apply(),bind()函数的区别与用法详解

 更新时间:2022年12月10日 15:10:47   作者:小刺猬_0421  
这篇文章主要介绍了JS中call(),apply(),bind()函数的高级用法详解,需要的朋友可以参考下

call()

介绍

通过提供一个新的this值给当前调用的函数/方法,从而改变this指向。

语法

fn.call(this.Arg, arg1, arg2,...)

thisArg:当前调用函数this指向的对象
arg1, arg2:传递的其他参数(直接传给形参可不写)

特点

  • 可以直接调用函数—fn.call()
  • 可以改变被调用函数的this指向为指定的— fn.call(this.Arg)

返回值

使用调用者提供的值和参数调用该函数的返回值,也就是函数的返回值。若该方法没有返回值,则返回undefined

使用(主要应用)

通过使用call()来实现继承

// 借用父构造函数继承属性
// 父构造函数
function Father(name, age) {
    this.uname = name
    this.age = age
}
// 子构造函数
function Son(name, age) {
    Father.call(this, name, age)
}
var son = new Son('小明', 10)
console.log(son); // Son {uname: '小明', age: 10}

apply()

介绍

apply-应用、运用的意思。
apply()-调用一个具有给定值的函数,以及以一个数组(或一个类数组对象)的形式提供的参数this,简单理解为调用函数的,fang'shi但是它可以改变this指向。

语法

fn.apply(this.Arg, [argsArray])

thisArg:在fn函数运行时指定的this值,当不需要改变this指向时这里可以填null
argsArray:传递的值,必须包含在数组里面。

特点

  • 也是调用函数—fn.apply()
  • 可以改变函数内部的this指向—fn.apply(this)但是它的参数必须是数组(伪数组)

返回值

apply()的返回值就是函数的返回值,因为它就是调用函数。
使用调用者提供的值和参数调用该函数的返回值。若该方法没有返回值,则返回undefined

使用

var a = {
    name: '小红'
}
function fn(arr) {
    console.log(this); // {name: '小红'}
    console.log(arr); // blackpink 传字符串就输出字符串传数字就输出数字
}
fn.apply(a, ['blackpink'])
// fn.apply() // this->window arr->undefined

典型应用: 借助于数学内置对象求值。

var arr = [1, 66, 3, 99, 4]
// var max = Math.max.apply(null, arr) // 虽然这里的this指向不需要改变填null没有错
var max = Math.max.apply(Math, arr) // 但是这里最好是让this指向函数的调用者是最合适的
var min = Math.min.apply(Math, arr)
console.log(max); // 99
console.log(min); // 1

bind()

介绍

bind:绑定、捆绑
bind():不会调用函数,但是也能改变函数内部的this指向

语法

fn.bind(thusArg, arg1, arg2, ...)

thisArg:在fn函数运行时指定的this值
arg1, arg2:传递的其他参数

特点

  • 不会调用原来的函数,不会立即调用
  • 可以改变原来函数内部的this指向;
  • 返回的是原函数改变this之后产生的新函数

返回值

  • 返回由指定的this值和初始化参数改造的原函数拷贝

使用

var c = {
    name: '大华'
}
function fn() {
    console.log(this); // {name: '大华'}
    console.log(a + b); // 3
}
// fn.bind(c) // 这里不会有输出值
var f = fn.bind(c, 1, 2)
f() // 拷贝函数所以输出值用函数调用

典型应用
如果有的函数我们不需要立即调用,但是又想改变这个函数内部this指向,此时用bind(),eg:点击发送验证码60秒后才能二次点击

    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>

var btns = document.querySelectorAll('button')
for (var i = 0; i < btns.length; i++) {
    btns[i].onclick = function() {
        this.disabled = true // 这个this指向的是调用者btn
        setTimeout(function() {
            // this.disabled = false; // 只用这一个不加bind的话会不管用,因为定时器里面的this指向的是window
            this.disabled = false // 此时这里的this指向的是当前点击的那个btn
        }.bind(this), 3000) // 这个this指向的是btn这个对象
    }
}

call(),apply(),bind()的区别

三者相同点

  • 都可以改变函数内部的this指向

不同点

  • callapply 会调用函数,并且改变函数内部this指向;
  • callapply 的传参不一样,call 传参aru1, aru2...形式,apply 必须为数组形式 [arg]
  • bind 不会直接调用函数,但是可以改变函数内部this指向;

应用场景不同:

  • call 经常做继承;
  • apply 经常跟数组有关系,比如借助于数学对象实现数组最大最小值;
  • bind 不调用函数,但是还想改变this指向,比如改变定时器内部this指向;

以上既是JS中call(),apply(),bind()函数的区别与使用方法,更多关于这3个函数的使用方法请查看下面的相关链接

相关文章

  • JavaScript获取当前窗口内的宽度和高度汇总

    JavaScript获取当前窗口内的宽度和高度汇总

    这篇文章主要介绍了JavaScript获取当前窗口内的宽度和高度汇总的相关资料,需要的朋友可以参考下
    2023-02-02
  • 浅谈javascript中return语句

    浅谈javascript中return语句

    这篇文章主要给大家简单介绍了javascript中return语句,有需要的小伙伴可以参考下。
    2015-07-07
  • 浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预

    浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预

    下面小编就为大家带来一篇浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • JS小游戏之仙剑翻牌源码详解

    JS小游戏之仙剑翻牌源码详解

    这篇文章主要介绍了JS小游戏之仙剑翻牌源码,是一款比较经典的卡牌类游戏,对于javascript游戏设计有不错的借鉴价值,需要的朋友可以参考下
    2014-09-09
  • 微信小程序—setTimeOut定时器的问题及解决

    微信小程序—setTimeOut定时器的问题及解决

    这篇文章主要介绍了微信小程序—setTimeOut定时器的问题及解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • js使用eval解析json实例与注意事项分享

    js使用eval解析json实例与注意事项分享

    eval函数在js中有不少用处了,下面我来给各位朋友介绍eval解析json的实例,基于这个实例我们引出来在eval处理json数据时的一些注意事项,希望文章对各位同学会有所帮助
    2014-01-01
  • webpack中的filename 和 chunkFilename 的区别实例解析

    webpack中的filename 和 chunkFilename 的区别实例解析

    filename 指列在 entry 中,打包后输出的文件的名称,chunkFilename 指未列在 entry 中,却又需要被打包出来的文件的名称,这篇文章主要介绍了webpack中的filename 和 chunkFilename 的区别实例解析,需要的朋友可以参考下
    2023-11-11
  • JavaScript实现页面跳转的几种常用方式

    JavaScript实现页面跳转的几种常用方式

    这篇文章主要介绍了JavaScript实现页面跳转的几种常用方式,结合实例形式对比分析了JavaScript页面跳转的常见实现技巧与相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 巧用weui.topTips验证数据的实例

    巧用weui.topTips验证数据的实例

    下面小编就为大家带来一篇巧用weui.topTips验证数据的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • javascript实现日历控件(年月日关闭按钮)

    javascript实现日历控件(年月日关闭按钮)

    经常使用google的朋友一定对google绚丽的日历控件记忆犹新吧,那我们也来实现一个,虽然功能和效果比不上,但重要的是实现的过程
    2012-12-12

最新评论