mad*_*ox2 23 javascript functional-programming ecmascript-6
我只是想知道是否有任何理由要求:
Reflect.apply(myFunction, myObject, args);
Run Code Online (Sandbox Code Playgroud)
代替:
myFunction.apply(myObject, args);
Run Code Online (Sandbox Code Playgroud)
Ori*_*iol 14
你可以比较的定义Function.prototype.apply,并Reflect.apply在规范中.
基本上它们是等价的,但是有区别:如果参数列表是null或者undefined,Function.prototype.apply将调用没有参数的函数,并且Reflect.apply将抛出.
function func() {
return arguments.length;
}
func.apply(void 0, null); // 0
Reflect.apply(func, void 0, null); // TypeError: null is not a non-null object
Run Code Online (Sandbox Code Playgroud)
另一个区别是,当你使用时func.apply,你假设
func是一个Function实例,即它继承自Function.prototypefunc没有apply自己的财产可以影子Function.prototype.apply但Reflect.apply不要求那样做.例如,
var obj = document.createElement('object');
typeof obj; // "function" -- can be called
obj.apply; // undefined -- does not inherit from Function.prototype
Reflect.apply(obj, thisArg, argList); // -- works properly
Run Code Online (Sandbox Code Playgroud)
var func = a => a;
func.apply = a => 0;
func.apply(void 0, [123]); // 0 -- Function.prototype.apply is shadowed by an own property
Reflect.apply(func, void 0, [123]); // 123 -- works properly
Run Code Online (Sandbox Code Playgroud)
另请参阅SO问题Reflect对象在JavaScript中的作用是什么?,在最佳答案中包含此文字:
现在我们有了模块,"@ reflect"模块对于之前在Object上定义的许多反射方法来说是一个更自然的地方.出于向后兼容的目的,Object上的静态方法不太可能消失.但是,新方法可能会添加到"@reflect"模块而不是Object构造函数中
我的理解是,在以前的JS迭代中,与"反射"相关的工具已经分散在语言中,作为Object原型和Function原型的一部分.的Reflect目的是使他们在一个屋檐下的努力.
因此,就你的问题而言,虽然存在差异(参见Oriol的答案),但两者存在的原因是在ES规范中对未来验证反射工具的一般转移.
| 归档时间: |
|
| 查看次数: |
2708 次 |
| 最近记录: |