代码如下(第二、三行的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~
这里的context实际上迷惑你的,没有用,因为你根本没传参数进去!当你调用函数时用
n.time (function(n){console.log(n+"hello")})
此时只传了一个第一个f参数进去也就是就是函数进去,第二个没传,肯定是undefined,你将那个f.call(undefned,i)写成f.call(null,i)肯定也对。
嗯。你说的完全正确。但是call方法调用时第一个传入的参数不是应该是要调用函数的母对象吗?函数f的母对象是什么呢?为啥这里就写了一个context
@Craftsman_Gao:
第一个参数也可以为空!因为你直接操作的数字类型,直接对它原型进行操作循环就ok,如果有需要继承其属性的对象,当然也可以传进去!第一个参数不是非给不可!
@Recluse_Xpy: 哦。原来如此,那么经典的《JavaScript权威指南》,怎么会有这样的代码,真令人蛋疼。。
就是可以多传一个参数。
n.times(function(n) 这个应该可以写成 n.times(function(n,l) 这种形式,如果书上给的代码是正确的,是不是就是说 JS 支持自动函数泛化(单参数函数可以匹配两参数函数)。
你说的我没太懂。我看书上是这么介绍call方法的:call()和apply()的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用。照这么说context应该是f的母对象啊,但是我用console.log(context);输出context时显示的时undefined的呀?能再详细说说吗