• javascript 的bind/apply/call性能


    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构造的一个语法糖罢了~

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

  • 相关阅读:
    Git远程库
    Git的使用
    如何利用IO流复制文件
    Lambda表达式
    Lambda表达式的标准格式
    线程池的使用步骤
    解决线程安全的三个方法
    多线程
    位运算
    如何用javadoc生成java帮助文档
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4891645.html
Copyright © 2020-2023  润新知