首页 新闻 会员 周边

关于《JavaScript权威指南》书上一段代码的疑问??

0
悬赏园豆:10 [已解决问题] 解决于 2015-08-13 10:33

代码如下(第二、三行的console.log语句是我自己添加的):

Number.prototype.times = function(f, context){
    console.log(f);
    console.log(context);
    var n = Number(this);
    for(var i=0; i<n; i++){
        f.call(context, i);
    }
}
var n = 3;
n.times(function(n){console.log(n + "hello");});

先且不说最后一句的执行结果是什么,我就想问问给Number原型定义的times方法中传入的参数context是啥意思啊?最后一句调用times方法时怎么就传入了一个匿名函数参数啊?for循环中 f.call(context, i); 这一句,call方法的第一个实参不是要调用函数的母对象嘛,这里传入一个context作何解释呀?新手学艺不精,还请大家帮助哈O(∩_∩)O~

clearbug的主页 clearbug | 菜鸟二级 | 园豆:268
提问于:2015-08-13 08:48
< >
分享
最佳答案
0

这里的context实际上迷惑你的,没有用,因为你根本没传参数进去!当你调用函数时用

n.time (function(n){console.log(n+"hello")})

此时只传了一个第一个f参数进去也就是就是函数进去,第二个没传,肯定是undefined,你将那个f.call(undefned,i)写成f.call(null,i)肯定也对。

收获园豆:8
Jeffcky | 老鸟四级 |园豆:2789 | 2015-08-13 10:14

嗯。你说的完全正确。但是call方法调用时第一个传入的参数不是应该是要调用函数的母对象吗?函数f的母对象是什么呢?为啥这里就写了一个context

clearbug | 园豆:268 (菜鸟二级) | 2015-08-13 10:25

@Craftsman_Gao: 

第一个参数也可以为空!因为你直接操作的数字类型,直接对它原型进行操作循环就ok,如果有需要继承其属性的对象,当然也可以传进去!第一个参数不是非给不可!

Jeffcky | 园豆:2789 (老鸟四级) | 2015-08-13 10:28

@Recluse_Xpy: 哦。原来如此,那么经典的《JavaScript权威指南》,怎么会有这样的代码,真令人蛋疼。。

clearbug | 园豆:268 (菜鸟二级) | 2015-08-13 10:32
其他回答(1)
0

就是可以多传一个参数。

n.times(function(n) 这个应该可以写成 n.times(function(n,l) 这种形式,如果书上给的代码是正确的,是不是就是说 JS 支持自动函数泛化(单参数函数可以匹配两参数函数)。

收获园豆:2
Launcher | 园豆:45045 (高人七级) | 2015-08-13 10:10

你说的我没太懂。我看书上是这么介绍call方法的:call()和apply()的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用。照这么说context应该是f的母对象啊,但是我用console.log(context);输出context时显示的时undefined的呀?能再详细说说吗

支持(0) 反对(0) clearbug | 园豆:268 (菜鸟二级) | 2015-08-13 10:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册