call、apply、bind
***call,apply,bind
替换this
何时: 只要this不是想要的都可用call,apply,bind替换
选择:
call/apply: *调用*函数,在调用时,*临时*替换函数中的this为指定对象.
何时: 希望在调用函数时,临时替换this,就用call
apply的作用和call完全一样!
差别: apply要求传入函数的参数,必须放在数组中传入。
apply可自动打散数组类型参数为单个数据再传递给函数参数
回顾: Math.max(值1,值2,…)
Math.max.apply(null,arr)
apply: 1. 调用max
2. 用null代替max中的this——无视
3. 打散arr,再分别传给max
bind: 基于原函数*创建*一个新函数,*永久*绑定其中的this为指定对象
function calc(base,bonus1,bonus2){
console.log(this.ename+"的总工资是:"
+(base+bonus1+bonus2));
}
var lilei={ename:"Li Lei"};
var hmm={ename:"Han Meimei"};
calc.call(lilei,10000,1000,2000);
var hmm_sals=[3000,4000,5000];
calc.apply(hmm,hmm_sals);
//calc(10000,1000,2000); var lilei_calc=calc.bind(lilei,10000);
//lilei_calc:function(base=10000,bonus1,bonus2){
// ...lilei.ename...
// }
lilei_calc(1000,2000);
lilei_calc(2000,3000);
//lilei_calc.call(hmm,3000,4000,5000);
var name = 'global';
var person = {
name: 'zero'
};
// 输出姓名、年龄和职业
function printInfo(age, job) {
console.log(this.name, age, job);
}
// 直接调用
printInfo(20, '前端工程师');
// 打印:global 20 前端工程师
// 因为默认的上下文是window,所以this.name是全局定义的global,如果我们想打印出来zero的话,就需要改变函数执行的上下文
printInfo.call(person, 20, '前端工程师');
printInfo.apply(person, [20, '前端工程师']);
// 这两种方式是一样的,第一个参数都是传进去的上下文,this.name取的是person.name,所以打印出来的名字就是zero了,后面的为age和job,只是参数传递的方式不一样,apply比较特殊,把要传的参数放在数组里面
// 而bind和以上两种有区别,bind是es5定义的新方法,用来返回一个有自己上下文的函数,用法也比较类似:
printInfo.bind(person)(20, '前端工程师');
// printInfo.bind(person)这一块是返回的以peron为上下文的函数,后面的(20, '前端工程师')是函数调用
call、apply、bind的更多相关文章
- JS中call、apply、bind使用指南,带部分原理。
为什么需要这些?主要是因为this,来看看this干的好事. box.onclick = function(){ function fn(){ alert(this); } fn();}; 我们原本以 ...
- Javascript中call、apply、bind函数
javascript在函数创建的时候除了自己定义的参数外还会自动新增this和arguments两个参数 javascript中函数也是对象,call.apply.bind函数就是函数中的三个函数,这 ...
- 图解call、apply、bind的异同及各种实战应用演示
一.图解call.apply.bind的异同 JavaScript中函数可以通过3种方法改变自己的this指向,它们是call.apply.bind.它们3个非常相似,但是也有区别.下面表格可以很直观 ...
- JavaScript中call、apply、bind、slice的使用
1.参考资料 http://www.cnblogs.com/coco1s/p/4833199.html 2.归结如下 apply . call .bind 三者都是用来改变函数的this对象的指向 ...
- JS中的call、apply、bind方法
JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]] ...
- js中call、apply、bind那些事
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- 数组去重,call、apply、bind之间的区别,this用法总结
一.数组去重,直接写到Array原型链上. //该方法只能去除相同的数字 不会去判断24和'24'是不同的 所有数字和字符串数字是相同是重复的 Array.prototype.redup=functi ...
- javascript中call()、apply()、bind()的用法终于理解
其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge; //17 obj.myFun() //小张年龄undefined 例2 shows( ...
- JS 中的this指向问题和call、apply、bind的区别
this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...
随机推荐
- Flask的插件session、SQLAlchemy、Script、Migrate
一.flask-session 1.为什么要使用flask-session 因为flask默认的session是通过请求上下文放入到Local中的,是存在内存的,而使用flask-session可以更 ...
- Nginx-Tomcat搭建负载均衡(转载)
一. 工具 nginx-1.8.0 apache-tomcat-6.0.33 二. 目标 实现高性能负载均衡的Tomcat集群: 三. 步骤 1.首先下载Nginx,要下载稳定版: 2 ...
- vue---mixins的用法
相信大家都用过less.sass等预编译器.它们中也有mixins,用法也很简单,例如Less中: .box{ border:1px solid red; padding:10px; } .mixin ...
- 2018年秋季学期《c语言程序设计》助教总结
<c语言程序设计>第七周助教总结 <c语言程序设计>第八周助教总结 <c语言程序设计>第九周助教总结 <c语言程序设计>第十周助教总结 <c语言程 ...
- MDK填充FLASH为0xFF
title: MDK填充FLASH为0xFF date: 2019/1/3 20:34:05 --- MDK填充FLASH为0xFF 参考 area 指定地址 https://blog.csdn.ne ...
- css中的数学表达式calc()
前言 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路. 概念 数学表达式calc()是calculate计算的缩写,它允许使用+.-.*. ...
- Correction suggestions
1. title: A remark on the global existence of weak solutions to the compressible quantum Navier-Stok ...
- css 常用的绝对定位元素水平垂直居中的方法
两种方法都能够实现: 1. div { height:80%; /*一定要设置高度*/ overflow:hidden;/*建议设置*/ margin: auto; position: absolut ...
- Flink学习(三)状态机制于容错机制,State与CheckPoint
摘自Apache官网 一.State的基本概念 什么叫State?搜了一把叫做状态机制.可以用作以下用途.为了保证 at least once, exactly once,Flink引入了State和 ...
- MySQL数据库学习2 - 数据库的操作
一.系统数据库 二.创建数据库 三.数据库相关操作 四.了解内容 一.系统数据库 执行如下命令,查看系统库 show databases; information_schema: 虚拟库,不占用磁盘空 ...