博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
apply、call、bind有什么区别?
阅读量:4583 次
发布时间:2019-06-09

本文共 2354 字,大约阅读时间需要 7 分钟。

使用 apply

var a = {        name : "Cherry",        func1: function () {            console.log(this.name)        },        func2: function () {            setTimeout(  function () {                this.func1()            }.apply(a),100);        }    };    a.func2()            // Cherry

使用 call

var a = {        name : "Cherry",        func1: function () {            console.log(this.name)        },        func2: function () {            setTimeout(  function () {                this.func1()            }.call(a),100);        }    };    a.func2()            // Cherry

使用 bind

var a = {        name : "Cherry",        func1: function () {            console.log(this.name)        },        func2: function () {            setTimeout(  function () {                this.func1()            }.bind(a)(),100);        }    };    a.func2()            // Cherry

apply、call、bind 区别

刚刚我们已经介绍了 apply、call、bind 都是可以改变 this 的指向的,但是这三个函数稍有不同。

在 中定义 apply 如下;

apply() 方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数

语法:

fun.apply(thisArg, [argsArray])

  • thisArg:在 fun 函数运行时指定的 this 值。需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
  • argsArray:一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 fun 函数。如果该参数的值为null 或 undefined,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。浏览器兼容性请参阅本文底部内容。

apply 和 call 的区别

其实 apply 和 call 基本类似,他们的区别只是传入的参数不同。

call 的语法为:

fun.call(thisArg[, arg1[, arg2[, ...]]])

 

所以 apply 和 call 的区别是 call 方法接受的是若干个参数列表,而 apply 接收的是一个包含多个参数的数组。

var a ={        name : "Cherry",        fn : function (a,b) {            console.log( a + b)        }    }    var b = a.fn;    b.apply(a,[1,2])     // 3
var a ={        name : "Cherry",        fn : function (a,b) {            console.log( a + b)        }    }    var b = a.fn;    b.call(a,1,2)       // 3

bind 和 apply、call 区别

我们先来将刚刚的例子使用 bind 试一下
var a ={        name : "Cherry",        fn : function (a,b) {            console.log( a + b)        }    }    var b = a.fn;    b.bind(a,1,2)

我们会发现并没有输出,这是为什么呢,我们来看一下 上的文档说明:

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

所以我们可以看出,bind 是创建一个新的函数,我们必须要手动去调用:

var a ={        name : "Cherry",        fn : function (a,b) {            console.log( a + b)        }    }    var b = a.fn;    b.bind(a,1,2)()           // 3

 

转载于:https://www.cnblogs.com/Joe-and-Joan/p/10660544.html

你可能感兴趣的文章
javasrcipt中的for in 循环
查看>>
ThetaSome_ThetaAll子查询
查看>>
js面向对象
查看>>
PostgreSQL 监控磁盘使用
查看>>
git命令的使用 【备用】
查看>>
uva1391 2-SAT 问题
查看>>
冲刺2-4
查看>>
[bbk4774] 第30集 - 第三章 Flashback Table 07
查看>>
MD5 加密 以及 加盐加密
查看>>
模板中的名字查找问题
查看>>
Git与GitHub学习笔记(八)git如何同时同步提交到码云和GitHub上
查看>>
PHP7 学习笔记(十二)PHPExcel vs PhpSpreadsheet and PHP_XLSXWriter
查看>>
Spring MVC 中使用AOP 进行统一日志管理--注解实现
查看>>
【兼容性问题】
查看>>
HihoCoder 1441 后缀自动机一·基本概念 (入门神题)
查看>>
关于java项目导入,所碰到的版本问题
查看>>
SparkStreaming+Kafa+HBase
查看>>
Perl连接Sqlite数据库
查看>>
yum使用总结
查看>>
[LeetCode]Reverse Words in a String
查看>>