JS高级技巧

  高级技巧要利用ECMAScript的语言特点、BOM扩展和DOM功能来获得强大的效果。

1.高级函数——安全的类型检测

    js有时候需要人为的添加类型检测,因为js内置的类型检测技术部完全可靠。

这时候我们,,,要调用Object原始的toString()方法检测类型。toString()会返回【object NativeConstructorName】格式的字符串。

检测数组:Object.prototype.toString.call(value)=="[object Array]"

由于原始数组的构造函数名与全局作用域无关。

2.高级函数——作用域安全的构造函数

    由于构造函数的this对象是在运行的时候绑定的,所以调用构造函数的时候,如果忘记写new的话,构造函数中对this直接调用构造函数的this会映射到全局对象window上,导致错误对象属性的意外增加。

这时候我们,,,可以在作用域安全的构造函数在进行任何更改前,首先确认this对象是正确类型的实例。如果不是,则会创建新的实例并返回。

function Person(name){
    if(this instanceof Person){
        this.name = name;
    }else{
        return new Person(name)
    }
}
  注意:如果使用构造函数窃取模式的继承且不使用原型链,那这个继承很可能不管用。这个时候要使用原型链或者寄生组合就可以解决。

3.高级函数——惰性载入函数

    分支比较多的时候,可能会一直执行某一个条件的语句,其他语句执行的很少。那这时候可以不用执行这些语句了,执行一次就可以了——这就需要惰性载入的技巧了。

    惰性载入表示函数执行的分支仅会发生一次。

惰性载入的两种方法:

(1)。在函数被调用时再处理函数。

在第一次调用的过程中,该函数会被覆盖为另外一个按合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。

function f(){
    if(someCheck){
        f =function(){doSomeThing()};
    }else{
        f =function(){doAnotherSomeThing()};
    }
}
(2)。在声明函数时就指定适当的函数。第一次调用函数时不会损失性能,会在代码首次加载时损失一点性能。

声明函数时就指定适当的函数。通过匿名自执行函数

var f =function(){
    if(someCheck){
        return function(){doSomeThing()};
    }else{
        return function(){doAnotherSomeThing()};
    }
}();

此技巧的有点是只在执行分支代码时牺牲一点性能。

4.高级函数——函数绑定

    函数绑定要创建一个函数,可以在特定的this环境中以指定参数调用另一个函数。

出现的问题是,,,没有保存执行的环境,所以最后指向了dom按钮而非handler,可用闭包来解决,但是闭包多了会令代码难于理解和调试。因此,可以用bind()将函数绑定到指定环境。ECMAScript5提供了原始的bind()方法,不用自己定义。

注意,被绑定的函数与普通函数相比有更多的开销,他们需要更多的内存,同时也因为多重函数调用稍微慢些,所以最好在必要的时候使用。

5.高级函数——函数柯里化

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

function curry(fn, context){
//截取调用curry时候,除了fn,context,之后的所有参数
    var args =[].slice.call(arguments,2);
    returnfunction(){
//获取调用fn的所有参数
        var totalArgs = args.concat([].slice.call(arguments));
        return fn.apply(context, totalArgs);
    }
}

这样,可以来创建 var curriedAdd5 = curry(add, null, 5);//add是函数,5可以作为add的第二个参数。所以curriedAdd5(3)结果是8.

注意,javascript中的柯里化函数curry和bind函数提供了强大的动态函数创建功能,但是两者都不应该滥用,因为每个函数都带来额外的开销



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值