js学习之随心所欲

js 高级技巧

2019-04-24  本文已影响0人  摆渡侠
  1. 惰性载入函数
    function createXHR(){
        if(typeof XMLHttpRequest != 'undefined'){
        
            createXHR = function(){
                return new XMLHttpRequest();
            }
        }else if(typeof ActiveXObject != 'undefined'){
            createXHR = function(){
                return new ActiveXObject();
            }
        }else{
        
            createXHR = function(){
              throw new Error('no xhr object available')
            }
        }
        
        return createXHR();
    }
  1. 函数绑定 bind函数简单实现(还有更高级的封装,这里不多做介绍,只写最核心的几句)
    function bind(fn, context){
        return  function(){
            return fn.apply(context, anguments)
        }
    }
    var handler = {
        message: 'event handled',
        handleClick: function(event){
            console.log(this.message, event.type)
        }
    }
    
    var btn = document.querySelector('.btn');
    
    btn.addEventListener('click', bind(handler.handleClick, handler))
  1. 函数柯里化
    // 定义 柯里化是指这样一个函数(假设叫做createCurry),他接收函数A作为参数,运行后能够返回一个新的函数。并且这个新的函数能够处理函数A的剩余参数。
    这里因为比较多,不写重复了,大家参考https://www.codementor.io/michelre/currying-in-javascript-g6212s8qv
  1. 防篡改对象
1. 不可拓展对象
var p = {name: 'xm'}

判断是否不可拓展 Object.preventExtensions()
Object.isExtensible(p);    //true
Object.preventExtensions(p);
p.age = 29;
console.log(p.age)   // undefined

Object.isExtensible(p);    //false

2. 密封对象

var p = {name: 'xm'}

判断对象是否为密封对象
Object.isSealed(p)   //   false
Object.seal(p)
p.age = 18       //静默失败
delete p.name  //静默失败 

Object.isExtensible(p);    //false
Object.isSealed(p)   // true

3. 冻结的对象

var p = {name: 'xm'}

判断对象是否为冻结对象
Object.isForzen(p)    // false
Object.freeze(p)     
p.age =  17         //静默失败
delete p.name       //静默失败
p.name = 'xh'       //静默失败

Object.isExtensible(p);    //false
Object.isSealed(p)   // true
Object.isForzen(p)    // true

总结: 不可拓展对象不能为对象添加属性,但是能删除和修改属性
        密封对象不能为对象添加属性也不能删除属性,但是能修改属性值
         冻结对象不能为对象添加和删除属性,也不能修改属性值
  1. 高级定时器
1.重复定时器,用setTimeout 接连调用代替setInterval
setTimeout( () => {
    // do something
    setTimeout(() => {
        // do something
    })
})

2. 函数节流,主要运用在快速输入搜索,或者resize事件等频繁调用场景
function throttle(method, context) {
  clearTimeout(method.tId);
  method.tId = setTimeout( () => {
    method.call(context);
  })
}
上一篇下一篇

猜你喜欢

热点阅读