关于call()和apply()基本用法可以参阅如下两篇文章:
(1).call方法参阅JavaScript call()一章节。
(2).apply方法参阅JavaScript apply()一章节。
网上看到一段用法比较奇怪的代码,代码如下:
[JavaScript]
Function.prototype.apply.call(Math.floor, undefined, [1.75])
重新进行一下分组会更清晰:
[JavaScript]
(Function.prototype.apply).call(Math.floor, undefined, [1.75])
任何函数都是Function类的对象实例,所以Math.floor方法对象具有apply方法。
所以上面的代码可以修改等价于如下代码:
[JavaScript]
Math.floor.apply(undefined, [1.75])
上面的代码就很好理解了,就是一个普通的apply方法的应用。
即便是Math.floor对象没有apply方法,也是会转变为上面的格式,这就是call方法语法规定。
再来看一段代码实例:
[JavaScript] 运行代码
var num=Function.prototype.apply.call(function (b) { return this.a + b
}, {a:2},[1.75]) console.log(num);
例子:
function Person(name,age){
if(this instanceof Person)
{
this.myname=name;
this.age=age;
this.sayName=function(){
console.log(this.myname);
}
}else
{
return Person(name,age);
}
}
function p(age){
return new Person(this.a,age);
}
//Reflect.apply()是反射写法,他等于我们常见的Function.prototype.apply.call()
let r=Reflect.apply(p,{a:'xizo'},[29]);
r.sayName();
另一种调用方法,中间那个{a:'xizo'}用undefined代替
/*
function p(name,age)
{
return new Person(name,age);
}
let r=Reflect.apply(p,undefined,['xiao',29]);
r.sayName();
*/