JavaScript_高程三_02

高级技巧

高级函数

安全的类型检测

JavaScript 中内置的类型检测机制并非完全可靠

typeof操作符,由于它有一些无法预知的行为,导致检测数据类型时得到不靠谱的结果。(Safari直至第四版,对正则表达式 typeof 检测 会返回 'function')

instanceof操作符,存在多个全局作用域(像一个页面中包含多个frame)的情况下。

var isArray = valeu instaceof Array; // 返回true 条件:value 必须是数组, 必须与Array构造函数在同个全局作用域中。(Array 是 window的属性)。

在任何值上调用Object原生的toString();方法。
返回 [object NativeConstructorName]格式的字符串。每个类在内部都有一个[[Class]]属性,这个属性中指定了这个字符串中的构造函数名.

应用:
检测原生JSON对象。

var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON) === '[object JSON]';

作用域安全的构造函数

作用:自定义对象和构造函数的定义和用法。
构造函数就是一个使用new操作符调用的函数。当使用new调用时,构造函数内用到的this对象会指向新创建的对象实例。

问题:当没有使用new操作符来调用该构造函数的情况下。this对象是在运行时绑定的,所以直接调用 类名 ,this会映射到全局对象window上,导致错误对象属性的以外增加。

function Person ( name, age ) {    this.name = name;    this.age = age;}var p1 = Person('cyan', 22);console.log(window.name);console.log(window.age);// Person实例的属性被加到window对象上,因为构造函数时作为普通函数调用,忽略了new操作符。由this对象的晚绑定造成的,在这里this被解析成了window对象。
// 在类中添加判断:function Person ( name, age ) {    if ( this instanceof Person ) {        this.name = name;        this.age = age;    } else {        return new Person(name, age);    }}var p1 = Person('cyan', 22);console.log(window.name);console.log(window.age);// 添加一个检查,并确保this对象是Person实例。// 要么使用new操作符,要么使用现有的Person实例环境中调用构造函数。

函数绑定
函数绑定要创建一个函数,可以在待定的this环境中指定参数调用另一个函数。
使用范围:回调函数与事件处理程序一起使用,(在将函数作为变量传递的同时保留代码执行环境)

// bind(); 函数function bind ( fn, context ) {    return function () {        return fn.apply(context, arguments);    }}

将某个函数以值的形式进行传递,同时该函数必须在特定环境中执行,被绑定的函数的效果。
主要用于事件处理程序以及setTimeout() 和 setInterval();
被绑定函数与普通函数相比有更多开销,需要更多内存支持,同时也因为多重函数调用调用比较慢。最好只在必要时使用。

函数柯里化

函数柯里化( function currying ): 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并返回接受余下的参数且返回结果的新函数

作用:创建已经设置好的一个或多个参数的函数。

函数柯里化的基本方法:使用一个闭包返回一个函数。

函数柯里化和函数绑定区别:当函数被调用时,返回的函数还需要设置一些传入的参数。

关键字:JavaScript, javascript面向对象, javascript原型, 函数


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部