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. Android自己定义控件:老版优酷的三级菜单(效果图 + Demo)

    效果图: 制作思路: 1.先分析这个效果,事实上能够理解为把三级菜单分成level1,level2,level3,level1是始终显示的. 点击level1后,level2会出现:点击level2后 ...

  2. 模拟spring框架注入实现原理

    这个我是参见了别人的一些东西,不是原创! 定义一些抽象的方法: package com.huxin.springinject.dao; public interface Person { public ...

  3. 【web必知必会】—— 图解HTTP(转)good

    本篇总结关于http的相关知识,主要内容参考如下导图: 主要讲解的内容有: 1 URL与URI的区别. 2 请求报文与相应报文的内容. 3 GET与POST的区别. 4 http的cookie.持久化 ...

  4. hdu4105  Electric wave

    Electric wave Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. adm下载器

    netdisk;5.2.7;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJia

  6. SE 2014年4月22日(二)

    如图配置: 网络中存在三个公有AS 其中AS200使用了 BGP联盟技术(如图配置) 在AS 100 中R1上起源了四条BGP路由,(1)要求全网BGP设备均能够正常学习 (2)要求:(使用BGP团体 ...

  7. 风起看云涌,叶落品人生 - Google 搜索

    风起看云涌,叶落品人生 - Google 搜索 风起看云涌,叶落品人生

  8. 在VS2012中使用GitHub

    注册GitHub账号(DeanZhouLin) https://github.com/ 向GitHub中添加一个仓库(Test) *创建完成后,记录该仓库的地址:https://github.com/ ...

  9. vmware无法链接U盘:vm-->removeable devices.

    vmware无法链接U盘:vm-->removeable devices.

  10. MySQL创建用户权限结果Trigger失败

    说来惭愧,MySQL我已经在只将用于,非常赞赏阶段. 甚至一些比较深层次的管理,不熟悉如何,我们要加强啊! 最近.系统测试,使用MySQL数据库,你需要在表上创建触发器.该数据库是安装在机.但.在任何 ...