JavaScript高级技巧(高级函数,高级定时器,自定义事件,拖放)

高级函数

安全类型检查
Web开发中能够区分原生与非原生JavaScript对象非常重要,只有这样才能确切的知道对象到底有哪些功能原生的
检查是不是原生的数组/函数/正则

function isArray(value){
    return Object.prototype.toString.call(value) == "[object Array]";
    // "[object Function/RegExp]"
}

作用域安全的构造函数
构造函数就是一个使用new操作符调用的函数,当使用new时,构造函数内的this对象会指向新创建的对象实例
问题出在当没有使用new时,调用构造函数,由于this对象是在运行时绑定,所以直接调用this对象就会映射到全局对象window上,导致错误对象属性的增加,创建一个作用域安全的构造函数

function Person(name,age){
    if(this instanceOf Person){
        this.name = name;
        this.age = age;
    }else {
        return new Person(name,age);
    }
}

惰性载入函数: 函数执行的分支仅会发生一次
- 在函数被调用时再处理函数
- 函数声明的时候就指定适当的函数

函数绑定
在特定的this环境中以指定参数调用另一个函数
ECMAScript 5为所有的函数定义了一个原生的bind()方法,需要传入作为this值的对象

函数柯里化:用于创建已经设置好一个或者多个参数的函数

防篡改对象
不能添加
JavaScript共享的本质,ECMAScript 5 增加了几个方法来把对象定义为防篡改,一旦定义就无法撤销

Object.preventExtension(obj);
Object.isExtensible(obj);// 是否可扩展

密封的对象
Object.seal(obj) 密封对象不可扩展,属性和方法不能删除,属性值可以修改

冻结的对象
Object.freeze(obj) 不可扩展,又是密封的

高级定时器

setTimeout()/setInterval()

setTimeout(function(){
    setTimeout(arguments.callee,interval)
},interval); 

上面的代码在前一个定时器代码执行完之前,不会向队列插入新的定时器代码,确保了不会有任何缺失的间隔,确保了下一次代码执行时至少等待指定的事件间隔,避免了连续运行

拖放: 为了元素能被拖放,它必须是绝对定位的

函数节流 进行过多的DOM操作的时候浏览器可能挂起,IE onresize很容易发生,为了防止这个问题,可以使用定时器对该函数节流
throttle() 接收两个参数,要执行的函数以及在那个作用域执行

猜你喜欢

转载自blog.csdn.net/u013270347/article/details/81004756