2

1、惰性加载函数 (判断各个浏览器中是否支持某个属性)

function addEvent(elem, type, handler){
    if(elem.addEventListener){
        return function(elem, type, handler){
            elem.addEventListener(type, handler, false);
        }
    }else if(elem.attachEvent){
        return function(elem, type, handler){
            elem.attachEvent("on"+type, handler);
        }
    }
}

这样书写代码,函数只会在第一次执行的时候去做检查,以后每一次都自动执行确定的函数操作。
2、函数绑定和函数柯里化
函数绑定可以让函数在指定的环境中执行某一段代码;函数柯里化可以让函数在任何情况下传递任何数量的参数去执行。

函数绑定

function bind(fn, context, args){
    return function(args){
        fn.call(context, args);
    }
}

函数柯里化

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

函数柯里化主要解决的问题是,已有的接口不适合我们当前的操作环境,需要对已有的接口进行相应的转换才可以使用。

ECMAScript 5允许通过以下几种方式来创建防篡改对象。

•不可扩展的对象,不允许给对象添加新的属性或方法。
•密封的对象,也是不可扩展的对象,不允许删除已有的属性和方法。
•冻结的对象,也是密封的对象,不允许重写对象的成员。

setTimeout和setInterval

setTimeout的定义是指多少时间之后将回调函数加入到js的执行队列之中;回调函数是否立即执行取决于当前的执行队列是否空闲。比较好的例子如下:

elem.on("click", function(event){
    setTimeout(function(){
        //回调函数
    }, 400);
    //执行其他click操作
})

假如click内部的执行时间为500,那么setTimeout的回调函数至少要等待500ms才执行。

setTnterval是重复定时器。它只允许当前js执行队列中有一个相同的回调函数在执行,比如说时间间隔为200ms,但是回调函数的执行时间为404,那么当第二个回调函数要加入到执行队列中时,发现第一个回调函数在执行,那么第二个回调函数不会加入到执行队列中。

自定义事件

具体实现方式:每一个绑定自定义事件时,给每一个事件类型加对应的回调函数数组;每一次触发自定义事件时,将对应的回调函数数组里的回调函数挨个执行一次。

拖拽
使用的事件类型未mouseenter、mousemove、mouseleave事件。需要考虑offsetX和offsetY的值。可以加入自定义事件来拓展("dragstart"、"drag"、"dragend")。


XIAOYI
243 声望4 粉丝

努力的童工!