javascript有两种使用频率非常高的三个内置的功能:bind/apply/call。许多技术是基于高点,这些功能实现。这三个功能被用来改变的功能运行环境.从而达到代码复用的目的。

先来所说bind函数, bind,函数通常有两个用途:

1. 创建新函数,指定函数的this指针。

name = 'global';
var obj1 = {name: 'foo'};
var showName = function() {
console.log(this.name);
}
showName(); //global var showObj = showName.bind(obj1);
showObj(); // foo

2. bind函数体现出偏函数的思维,能够有效降低匿名函数的使用,譬如,有一个接收用户不同请求并分发处理的模块:

//query: 请求參数
//config:不同请求的配置信息
function dispatcher(query, config) {
var action = query.action;
switch(action){
case 'action1':{
//....
break;
}
}
}

dispatcher函数运行的操作都是相似的,仅仅是不同的用户请求须要不同的config配置信息。能够有例如以下做法:

function createDispatcher(config) {
return function(query) {
dispatcher(query, config);
};
}

当然假设须要多个參数也能够这样搞:

function createDispatcher(config, ext) {
//借用Array原型对象的slice函数把函数參数拷贝一份
var args = Array.prototype.slice.call(arguments);
return function (query) {
var newArgs = args.push(query);
dispatcher.apply(null, newArgs);
};
}

假设通过bind来实现,能够这样搞:

function dispatcher(config, query) {
//
} //创建分发函数
var dispatch1 = dispatcher.bind(null, config1);
var dispatch2 = dispatcher.bind(null, config2);
var dispatch3 = dispatcher.bind(null, config3);

在这里我们不须要改变bind返回的偏函数的this指针。所以bind函数第一个參数传null。

仅仅须要指定一个固定的參数。所以一句话就搞定了。

再说说apply函数。apply和call函数能够方便的实现函数借用。javascript这样的基于原型继承的语言,基础类型的原型为我们提供了很多方便的内建函数,譬如,我要把上面的分发函数写成一个通用的模块。即:把分发行为也抽象出来,由使用者来指定函数行为。createDispatcher仅仅是收集用户參数并调用指定的动作函数:

function createDispatcher(doit, context) {
var args = Array.prototype.slice.call(arguments, 2);
return function() {
doit.apply(context, args.concat(Array.prototype.slice.call(arguments));
}
} var obj1 = {name: 'obj1'};
var obj2 = {name: 'obj2'};
var showParams1 = function() {
console.log(this.name + 'got it: ' + arguments.join('+'));
}; var showParams2 = function() {
console.log(this.name + 'got it: ' + arguments.join('-'));
};
//obj1 got it: 1+2+3
createDispatcher(showParams1, obj1)(1, 2, 3);
//obj2 got it: 4-5-6
createDispatcher(showParams2, obj2)(4, 5, 6);

apply与call的唯一差别是apply通过数组的形式传參,而call须要把參数列在函数后面,能够觉得apply是javascript语言基于call构造的一个语法糖罢了~

版权声明:本文博主原创文章,博客,未经同意不得转载。

javascript 的bind/apply/call性能的更多相关文章

  1. javascript中bind,apply,call的相同和不同之处

    javasctipt中bind,apply,call的相同点是: 1,都是用来改变this的指向; 2,都可以通过后续参数进行传参; 3,第一个参数都是指定this要指向的对象; 不同点: 1,调用方 ...

  2. 博文推荐】Javascript中bind、call、apply函数用法

    [博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...

  3. 《JavaScript总结》apply、call和bind方法

    在JavaScript中,apply.call.bind这个三个方法,它们的作用都是为了改变某个函数运行时的上下文, 也就是改变函数体内的this指向. 在一个函数里,存在“定义时上下文”.“运行时上 ...

  4. javascript中call,apply,bind的用法对比分析

    这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们.   关于call,apply,bind这三个函数的用法,是学习java ...

  5. 面试官:能解释一下javascript中bind、apply和call这三个函数的用法吗

    一.前言    不知道大家还记不记得前几篇的文章:<面试官:能解释一下javascript中的this吗> 那今天这篇文章虽然是介绍javascript中bind.apply和call函数 ...

  6. javascript中bind函数的作用

    javascript的bind的作用 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  7. bind,apply,call的区别

    在Javascript中,bind, apply, call方法都可以显式绑定上下文this,这三者有何不同呢? bind只绑定this不马上执行 var person = { firstname: ...

  8. 箭头函数表达式和声名式函数表达式的区别以及 Function.prototype的bind, apply,call方法

    箭头函数不能用做构造函数 箭头函数没有arguments参数 箭头函数没有自己的this,是从作用域链上取this,是与箭头函数定义的位置有关的,与执行时谁调用无关,所以用call,apply,bin ...

  9. javascript call与apply关键字的作用

    apply接受两个参数.第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合. call则是apply的语法糖,如果参数数量固定,则可以不用带下标的集合传第二个参数. 1 2 3 4 ...

随机推荐

  1. 玩转Windows服务系列——服务运行、停止流程浅析

    原文:玩转Windows服务系列——服务运行.停止流程浅析 通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大 ...

  2. [Android学习笔记]使用getIdentifier()获取资源Id

    使用getIdentifier()获取资源Id Android中可以使用getIdentifier()获取资源ID ex: 根据图片名称获取图片Id private int getImageResId ...

  3. 使用Python在2M内存中排序一百万个32位整数

    译言网 | 使用Python在2M内存中排序一百万个32位整数 使用Python在2M内存中排序一百万个32位整数 译者:小鼠 发表时间:2008-11-13浏览量:6757评论数:2挑错数:0 作者 ...

  4. 10105 - Polynomial Coefficients

    描述:杨辉三角与二项式定理 #include <cstdio> int solve(int n,int m) { int sum=1; for(int i=n; i>m; --i) ...

  5. 移动app接口编程技术-学习实现之PHP进阶 数组

    数组创建,初始化 <?php //请创建一个数组变量arr,并尝试创建一个索引数组 /** * 不带初始值的创建.创建后赋予值 * 注:下标一定是整数 */ $arr = array(); $a ...

  6. ZooKeeper的安装、配置、启动和使用(一)——单机模式

    ZooKeeper的安装.配置.启动和使用(一)——单机模式 ZooKeeper的安装非常简单,它的工作模式分为单机模式.集群模式和伪集群模式,本博客旨在总结ZooKeeper单机模式下如何安装.配置 ...

  7. leetcode回文子串拆分-最小拆分次数

    转载请注明来自souldak,微博:@evagle 上一篇是要输出所有的可能拆分,这回是要输出拆分次数最少的切割次数. 如果直接按照上一篇那么做的话,就会超时,因为我们在判断s[i][j]是否是回文的 ...

  8. Twenty Newsgroups Classification任务之二seq2sparse(5)

    接上篇blog,继续分析.接下来要调用代码如下: // Should document frequency features be processed if (shouldPrune || proce ...

  9. MVC应用程序与多选列表(checkbox list)

    原文:MVC应用程序与多选列表(checkbox list) 程序中,经常会使用checkbox lsit来呈现数.能让用户有多选项目.此博文Insus.NET练习的checkbox list相关各个 ...

  10. A Game of Thrones(14) - Catelyn

    Ned and the girls were eight days gone when Maester Luwin came to her one night in Bran’s sickroom, ...