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

你可能感兴趣的:(18|高级函数)