最近在学习javascript的时候,发现了一个有趣东西,那就是Function.prototype.call.apply(handleFn,obj)
。咋一看,还有点懵逼,这用法有啥用啊?别急,我们来一步一步分析它。
首先我们先来看一个最基本的例子:
var obj = {
}
function fn(payload) {
this.name = payload || "默认值"
}
fn.call(obj, "张三");
console.log(obj);//{name:"张三"}
复制代码
上述代码输出为{name:"张三"}
,这个结果不奇怪,就是call
的简单用法,至于apply、bind这里不做演示,不知道的读者,请自行查阅。
接下来分析Function.prototype.call.apply(handleFn,obj)
:
参数分析:handleFn(函数) obj(想要绑定的对象)
- 你可以把Function.prototype.call看出一个整体,将参数按照apply的形式传进去
Function.prototype.call.apply(handleFn,[obj,1,2,3]) //相当于 handleFn.apply(obj,[1,2,3]) 复制代码
- 如果不明白我们继续看另一种
Function.prototype.call.call(handleFn,obj,1,2,3) //相当于 handleFn.call(obj,1,2,3) 复制代码
写一段代码,看一下输出,验证我们上面说的结果
-
示例代码:
var obj = { name: "杨志强", } function fn(arg1, arg2) { console.log(this.name); console.log(arg1); console.log(arg2); } 复制代码
-
输出验证:
Function.prototype.call.apply(fn, [obj, "参数一", "参数二"]);//杨志强 参数一 参数二 // 等价于 Function.prototype.call.call(fn,obj,"参数一","参数二");//杨志强 参数一 参数二 复制代码
从上面结果我们可以看出,
Function.prototype.XXX.YYY
,这个XXX
是call或者apply都可以,但是YYY
是决定传递参数形式的。 -
实际场景:计算每个学生的成绩
var stu1 = { chinese: 58, math: 68, english: 90 } var stu2 = { chinese: 80, math: 38, english: 90 } var utils = { getSum() { return this.chinese + this.math + this.english } } const calc = Function.prototype.call.bind(utils.getSum); const res = calc(stu1); const res2 = calc(stu2); console.log(res); console.log(res2); 复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END