一、惰性加载函数 (判断各个浏览器中是否支持某个属性)数组
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); } } }
这样书写代码,函数只会在第一次执行的时候去作检查,之后每一次都自动执行肯定的函数操做。
二、函数绑定和函数柯里化
函数绑定可让函数在指定的环境中执行某一段代码;函数柯里化可让函数在任何状况下传递任何数量的参数去执行。浏览器
函数绑定app
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); }; }
函数柯里化主要解决的问题是,已有的接口不适合咱们当前的操做环境,须要对已有的接口进行相应的转换才可使用。prototype
ECMAScript 5容许经过如下几种方式来建立防篡改对象。code
•不可扩展的对象,不容许给对象添加新的属性或方法。
•密封的对象,也是不可扩展的对象,不容许删除已有的属性和方法。
•冻结的对象,也是密封的对象,不容许重写对象的成员。对象
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")。