当前位置: 首页 > article >正文

JS高级—call(),apply(),bind()

文章目录

      • call()
        • 介绍
        • 语法
        • 特点
        • 返回值
        • 使用(主要应用)
      • apply()
        • 介绍
        • 语法
        • 特点
        • 返回值
        • 使用
      • bind()
        • 介绍
        • 语法
        • 特点
        • 返回值
        • 使用
      • call(),apply(),bind()的区别
        • 三者相同点
        • 不同点

call()

介绍

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

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

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

特点
  1. 可以直接调用函数—fn.call()
  2. 可以改变被调用函数的this指向为指定的— fn.call(this.Arg)
返回值

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

使用(主要应用)

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

// 借用父构造函数继承属性
// 父构造函数
function Father(name, age) {this.uname = namethis.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:传递的值,必须包含在数组里面。

特点
  1. 也是调用函数—fn.apply()
  2. 可以改变函数内部的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:传递的其他参数

特点
  1. 不会调用原来的函数,不会立即调用
  2. 可以改变原来函数内部的this指向;
  3. 返回的是原函数改变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指向的是调用者btnsetTimeout(function() {// this.disabled = false; // 只用这一个不加bind的话会不管用,因为定时器里面的this指向的是windowthis.disabled = false // 此时这里的this指向的是当前点击的那个btn}.bind(this), 3000) // 这个this指向的是btn这个对象}
}

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

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

应用场景不同:

  1. call 经常做继承;
  2. apply 经常跟数组有关系,比如借助于数学对象实现数组最大最小值;
  3. bind 不调用函数,但是还想改变this指向,比如改变定时器内部this指向;
http://www.lryc.cn/news/2416120.html

相关文章:

  • 网页中如何显示版权符号
  • Msn机器人要屏蔽安装msnshell插件的系统消息的方法
  • adobe flash player debug 官方 下载 地址
  • Java中的Socket的用法(普通Socket,NioSocket)
  • Input框属性输入汉字,数字的控制技巧
  • 剖析VB6.0如何连接数据库?
  • 光立方原理图理解
  • 剖析虚幻渲染体系(14)- 延展篇:现代渲染引擎演变史Part 1(萌芽期)
  • Google搜索的工作原理分析【图解】
  • android+rom+bootloader+flash,Android ROM开发(4) bootloader 三种启动模式
  • 不要再被骗了------QQ盗号原理大揭秘
  • 8086 CPU 寄存器
  • English interview。。。
  • 探索云端创新:CF-Worker-Dir - 一分钟搭建个性化导航页
  • 【网络奇遇记】因特网基础概览
  • 【你也能从零基础学会网站开发】 Win10系统下如何完美安装SQL Server 2000+解决SysWOW64权限限制方案!
  • dos命令特殊符号
  • RedFlag桌面6.0 Linux的安装 与Nvidia GeForce Mx440兼容性问题
  • 矩形区域剪裁区域
  • Delphi多线程
  • 解决d3dcompiler_42.dll错误找不到等问题
  • context.xml
  • Fedora 19的一些配置
  • 获取Android手机CPU类型 ARM、ARMV7、NEON
  • 触摸屏介绍—电阻触摸屏+电容触摸屏
  • 模仿淘宝htmlcss源码_仿淘宝商城源码html
  • 解锁数据新世界!一网打尽最全数据统计宝藏网站
  • mysql的批量更新的语法_MySQL中的Sqlalchemy批量更新非常有效
  • 中兴盒子ZTE-B860AV1.1T、AV2.1-通刷-线刷固件
  • 国内十大源码下载类知名网站总体简评