javascript中bind()、call()、apply()的使用
一直以来对bind()、apply()、call()这三个方法都模模糊糊的,现在有时间详细的看看这三个方法,并记录下来。
bind()
参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
- 定义:
bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。
- 用法:
func.bind(thisArg, arg1, arg2, ...)
var obj = {
a: 1,
b: 2,
getCount: function(c, d) {
return this.a + this.b + c + d;
}
};
window.a = window.b = 0;
var func1 = obj.getCount;
var func2 = obj.getCount.bind(obj);
console.log(func1(3, 4));//得到7
console.log(func2(3, 4));//得到10
- 说明:
bind()是Function的一个方法,所以应该是一个a函数来调用bind,参数是可以有若干个如(d,e,f),调用了bind方法后会返回一个新的方法b,b = a.bind(c,d,e,f),新函数b调用时,实际调用的却是a,但this指针指向的的却是c,d,e,f会作为参数带到a函数里面;
在上例中,func1之所以得到7是因为func1的this指向的是window,func2调用时this指向的是obj,所以得到10。
- 示例:
- 创建绑定函数(如上例):
(function() {
console.log(this.a);
}.bind({
a: 10
}))()//输出10
(function() {
console.log(this.a);
})()//输出undefined - 偏函数:创建一个调用另一个部分——参数或变量已经预置的的函数——的函数的用法(拗口,看示例吧),说白了就是让一个函数拥有预设的初始参数
//例1
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
var leadingThirtysevenList = list.bind(undefined, 37);//37作为list的预设的初始参数
var list2 = leadingThirtysevenList(); // [37]
var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]
//例2
function joinWords(a,b) {
return [a,b].join(' ');
}
//不使用bind
function prefixer(word) {
return function(b) {
return joinWords(word,b);
}
}
var prefixWithHate = prefixer('Hate');
console.log(prefixWithHate('Java'));//Hate Java
//使用bind
var prefixWithHate2 = joinWords.bind(window,"Hate");
console.log(prefixWithHate2('Java'));//Hate Java - 配合 setTimeout:如何用setTimeout连续打印0~9
for(var i = 0; i < 10; i++) {//不使用bind
(function(i) {
setTimeout(function() {
console.log(i);
}, i * 1000);
})(i);
}
for(var i = 0; i < 10; i++) {//使用bind
setTimeout(console.log.bind(null, i), i * 1000);//给了console.log一个默认的参数i
}
apply()、call()
参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
- 定义:
apply() 方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。
call() 方法调用一个函数, 其具有一个指定的this值,以及分别地提供的参数(参数的列表)。
- 用法:
fun.apply(thisArg, [argsArray])
fun.call(thisArg, arg1,arg2,arg3,...)
- 说明:
fun调用apply方法是这样fun里面的this指针指向thisArg,[argsArray]是一个数组或是类数组(arguments)作为fun函数的参数;
call方法除了参数和apply不一样其他都相同。
- 示例:
- 使用call/apply实现继承:
function a1(b){
this.b = b;
this.c = function(){
console.log(this.b);
}
}
function a2(b){
a1.apply(this,[b]);
//a1.call(this,b);
} var a3 = new a2(123);
a3.c();//打印出123 - 使用apply和内置函数
//得到最大值、最小值
var arr = [5,6,9,11,0,1,3];
var max = Math.max.apply(null,arr);
var min = Math.min.apply(null,arr);
console.log(max,min)//得到11,0
bind()、aplly()和call()的区别:
- 返回值不同:调用bind()返回一个新的函数,aplly()和call()返回调用这两个方法的函数的返回值,如:
function add(a,b){
return a + b;
}
function sub(a,b){
return a - b;
}
var a1 = add.bind(sub,3,2);
var a2 = add.apply(sub,[3,2]);
var a3 = sub.call(add,3,2);
console.log(a1,a1(),a2,a3);//得到的是:ƒ add(a,b){return a + b;},5,5,1
- 参数不同:bind()和call()的参数结构相同,都是this的新指向和一串参数,apply()的参数是this的新指向加一个数组或是类数组;
javascript中bind()、call()、apply()的使用的更多相关文章
- 面试官:能解释一下javascript中bind、apply和call这三个函数的用法吗
一.前言 不知道大家还记不记得前几篇的文章:<面试官:能解释一下javascript中的this吗> 那今天这篇文章虽然是介绍javascript中bind.apply和call函数 ...
- 博文推荐】Javascript中bind、call、apply函数用法
[博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...
- JavaScript函数 bind call apply区别
1. apply calll 在JavaScript中 call 和 apply 都是为了改变某个函数运行时上下文而存在的, 换句话说就是为了改变函数内部的this的指向. 这里我们有一个新的对象 b ...
- JavaScript中call、apply个人理解
JavaScript中call.apply个人理解 一句话即通俗的说:call.apply 是为了改变this的状态而存在的 }; } function personInfo(name,age){ t ...
- 说说 JavaScript中 call和apply
下面有关JavaScript中 call和apply的描述,错误的是? call与apply都属于Function.prototype的一个方法,所以每个function实例都有call.apply属 ...
- Javascript中call,apply,bind方法的详解与总结
在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,thi ...
- Javascript中call、apply、bind函数
javascript在函数创建的时候除了自己定义的参数外还会自动新增this和arguments两个参数 javascript中函数也是对象,call.apply.bind函数就是函数中的三个函数,这 ...
- Javascript中call,apply,bind的区别
一.探索call方法原理 Function.prototype.call = function(obj) { // 1.让fn中的this指向obj // eval(this.toString().r ...
- 深入浅出:了解JavaScript中的call,apply,bind的差别
在 javascript之 this 关键字详解文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变 ...
随机推荐
- openresty开发系列23--lua面向对象
openresty开发系列23--lua面向对象 面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构.java,c++,.net等都支持面向对 ...
- 【转载】 clusterdata-2011-2 谷歌集群数据分析(一)
原文地址: https://blog.csdn.net/yangss123/article/details/78298679 由于原文声明其原创文章不得允许不可转载,故这里没有转载其正文内容. --- ...
- Spring的@ExceptionHandler和@ControllerAdvice统一处理异常
之前敲代码的时候,避免不了各种try..catch, 如果业务复杂一点, 就会发现全都是try…catch try{ ..........}catch(Exception1 e){ ......... ...
- 逐层解析请求json参数字符串【我】
import net.sf.json.JSONObject; 逐层解析请求json参数字符串: InputStream inStream =null; BufferedReader br =null; ...
- Linux的桌面虚拟化技术KVM(二)——远程桌面管理
Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 远程桌面管理,指的是远程图形界面管理,所以要保证物理机要有图形化界面. (1).VNC管理 安装VNC-server服务,并进行配置 [ro ...
- 【k8s secret token 删掉自动重建】kubernetes secret 和 serviceaccount
https://stackoverflow.com/questions/54354243/kubernetes-secret-is-persisting-through-deletes
- 【GStreamer开发】GStreamer基础教程02——GStreamer概念
上一个教程演示了如何自动生成一个pipeline.这次我们打算用一个个element来手动搭建一个pipeline.我们这个教程会演示: 1. 什么是GStreamer的element以及如何建立一个 ...
- Echart timeline 高级用法!!!!
一.前言 在使用 echart timeline 来着图形可视化时,我使用的和官网也不一样,因为我有使用映射关系.比如我将 no 映射到X轴,将 d4 映射到Y轴. 二.参考 echart官网:htt ...
- lua . 命令收集
io.popen()## 原型:io.popen ([prog [, mode]]) 解释:在额外的进程中启动程序prog,并返回用于prog的文件句柄.通俗的来说就是使用这个函数可以调用一个命令(程 ...
- nohup保证程序后台运行
前言 我们运行某些命令的时候,它会默认在前台执行.如果要进行其他操作,则需要先停掉此程序.然后就蛋疼了. 解决 碰到这种情况,我们可以使用"nohup"命令和"&am ...