18|高级函数

01|安全类型检测

const isArray = value=>Object.prototype.toString.call(value)==="[object Array]"
const isFunction = value=>Object.prototype.toString.call(value)==="[object Function]"

02|函数绑定

函数绑定要创建一个函数,可以在特定的 this 环境中以指定参数调用另一个函数

function bind(fn, context){ 
    return function(){ 
        return fn.apply(context, arguments); 
    }; 
}

03|函数柯里化

用于创建已经设置好了一个或多个参数的函数

function curry(fn){
    let args = Array.prototype.slice.cal(arguments,1);
    return function(){
        let innerArgs = Array.prototype.slice.call(arguments);
        let finalArgs = args.concat(innerArgs);
        return fn.apply(null,finalArgs);
    }
}

04|防止篡改对象

// 不可扩展对象,使用该方法可以让传入的对象禁止添加属性和方法
Object.preventExtensions(obj);

// 使用Object.isExtensible(obj)可以判断对象是否可扩展
Object.isExtensible(obj);

// 密封的对象,不可扩展,不能删除,但可以修改
object.seal(obj);

// 使用Object.isSealed()可以确定对象是否密封
Object.isSealed(obj);

// 冻结的对象,不可扩展,密封,不能修改,访问器属性可写
Object.freeze(obj);

05|高级定时器

// 函数节流
function throttle(method,context){
    clearTimeout(method.tId);
    method.tId = setTimeout(function(){
        method.call(context);
    }, 100)
}

06|自定义事件

function EventTarget(){
    this.handlers = {};
}
EventTarget.prototype = {
    constructor: EventTarget,
    addHandler: function(type, handler){
        if(typeof this.handlers[type] == "undefined"){
            this.handlers[type] = [];
        }
        this.handlers[type].push(handler);
    },
    fire: function(event){
        if(!event.target){
            event.target = this;
        }
        if(this.handlers[event.type] instanceof Array){
            var handlers = this.handlers[event.type];
            for(var i=0,len=handlers.length;i<len;i++){
                handlers[i](event);
            }
        }
    },
    removeHandler: function(type, handler){
        if(this.handlers[type] instanceof Array){
            var handlers = this.handlers[type];
            for(var i=0, len=handlers.length; i<len; i++){
                if(handlers[i] === handler){
                    break;
                }
            }
            handlers.splice(i, 1);
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。