详解js的bind、call、apply
详解js的bind、call、apply
说明
虽然bind、call、apply都是js很基础的一块知识,但是我从未认真总结过这三者的区别。
由于公司后端是用的微服务架构,又没有中间层对接,导致前端这边非常难于处理接口数据。
于是我在项目初期封装了一套薄弱的api方法充当中间层的作用,还有为了让后端接口字段命名统一,也单独封装了一套方法用来统一每个微服务字段返回名。
但是,随着业务的增加,代码出现强耦合现象,到最后薄弱的中间层已经撑不住了,连代码的审视都变得很麻烦。
最后不得以重新设计这套api方法,幸好之前考虑周全留了个心眼,所以今天只花了一天时间就基本完成了。
最后的设计思路是不在api中间层使用restful风格的接口(当然后端接口还是不变),但是又为了api不重名,就选择让程序只加载当前页面api方法,也就是说如果用户如果当前操作的是A页面,那B页面的api方法是不会被载入的,这样也避免了首次加载程序的时候加载过多的api方法。
然后我在为每个api方法提供公共的数据处理方法的时候需要改变api方法的this指向,于是用到了call方法,所以有了此文。
后台=>通道
体验账号1:账号:“123456”。密码:“123456”
体验账号2:账号:“123123”。密码:“123123”
关于this指向
bind
bind用来创建一个新的函数,与普通函数不同,这个函数创建的时候可以指定运行环境。
let log=console.log;
let people = {
name: '张三',
getName: function() {
return this.name;
},
};
let getNameTo = function(hello) {
log(this.getName());
log(this.name+hello);
};
let logName = getNameTo.bind(people);
logName('你好啊!');

所谓的指定运行环境,就是指定运行时候的上下文
上面的代码如同以下:
let log=console.log;
let people = {
name: '张三',
getName: function() {
return this.name;
},
getNameTo:function(hello) {
log(this.getName());
log(this.name+hello);
}
};
people.getNameTo('你好啊!')
call()和apply()
- call和apply会立即执行调用它的函数
- call接受的参数是单个单个传递的,apply接受的参数则需要一个数组
let log=console.log;
var people = {
name: '张三',
getName: function() {
return this.name;
},
};
var getNameTo = function(a,b) {
console.log(this.getName() + a+ b);
};
getNameTo.call(people,'aa', 'bb');
getNameTo.apply(people,['11', '22']);

详解js的bind、call、apply的更多相关文章
- 详解js变量、作用域及内存
详解js变量.作用域及内存 来源:伯乐在线 作者:trigkit4 原文出处: trigkit4 基本类型值有:undefined,NUll,Boolean,Number和Strin ...
- [转]javascript console 函数详解 js开发调试的利器
javascript console 函数详解 js开发调试的利器 分步阅读 Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该 ...
- 详解js和jquery里的this关键字
详解js和jquery里的this关键字 js中的this 我们要记住:this永远指向函数运行时所在的对象!而不是函数被创建时所在的对象.this对象是在运行时基于函数的执行环境绑定的,在全局环境中 ...
- 详解js面向对象编程
转自:http://segmentfault.com/a/1190000000713346 基本概念 ECMA关于对象的定义是:”无序属性的集合,其属性可以包含基本值.对象或者函数.“对象的每个属性或 ...
- 详解js中的闭包
前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ...
- Jquery 选择器 详解 js 判断字符串是否包含另外一个字符串
Jquery 选择器 详解 在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jquery 各种在线工具地址:http://www.ostools ...
- 详解js中的apply与call的用法
前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受 ...
- 详解JS设计模式
原文链接:www.cnblogs.com 一:理解工厂模式 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式. 简单的工厂模式可以理解为解决 ...
- 详解 JavaScript的 call() 和 apply()
定义 ECMAScript规范为所有函数都包含两个方法(这两个方法非继承而来), call 和 apply .这两个函数都是在特定的作用域中调用函数,能改变函数的作用域,实际上是改变函数体内 this ...
随机推荐
- js280行代码写2048
2048 原作者就是用Js写的,一直想尝试.但久久未动手. 昨天教学生学习JS代码.最好还是就做个有趣的游戏好了.2048这么火,是一个不错的选择. 思路: 1. 数组 ,2维数组4x4 2. 移动算 ...
- 是readdir,还是readdir_r
readdir的原型如下: struct dirent *readdir(DIR *dirp); 因为内部使用了静态数据,所以readdir被认为不是线程安全的函数,POSIX[i]标准这样描述: T ...
- 05Redis入门指南笔记(持久化)
Redis的强劲性能很大程度上是由于将所有数据都存储在了内存中,然而当Redis重启后,所有存储在内存中的数据就会丢失.在一些情况下,希望Redis能将数据从内存中以某种形式同步到硬盘中,使得重启后可 ...
- AtCoder Beginner Contest 078 D ABS
光做C了,做完C,就要结束了,看了看D,没看懂那操作啥意思,就扔了. 刚才看了看,突然懂了.. 就是每个人从那堆牌上边拿牌,最少拿一张,最多可以全拿走,然后手里留下最后一张拿到的,其余的都扔掉. 比如 ...
- day2_python之文件操作
一.文件常用操作 #1. 打开文件的模式有(默认为文本模式): r ,只读模式[默认模式,文件必须存在,不存在则抛出异常] w,只写模式[不可读:不存在则创建:存在则清空内容] a, 之追加写模式[不 ...
- Python--day72--Cookie和Session内容回顾
1. Cookie是什么 保存在浏览器端的键值对 为什么要有Cookie? 因为HTTP请求是无状态的 Cookie的原理? 服务端可以在返回响应的时候 做手脚 在浏览器上写入键值对(Cookie) ...
- 解析XML内容到User对象
users.xml <?xml version="1.0" encoding="UTF-8"?> <xml-root> <conn ...
- 2018-8-10-git-提交添加-emoij-文字
title author date CreateTime categories git 提交添加 emoij 文字 lindexi 2018-08-10 19:16:52 +0800 2018-2-1 ...
- H3C 环路避免机制六:触发更新
- P1074 彩票摇奖
题目描述 为了丰富人民群众的生活.支持某些社会公益事业,北塔市设置了一项彩票.该彩票的规则是: (1) 每张彩票上印有 7 个各不相同的号码,且这些号码的取指范围为 1~33. (2) 每次在兑奖前都 ...