2013-05-03 56 views
3

我最近完成了DevTools〜>http://discover-devtools.codeschool.com/课程,并在检查中使用的代码我碰到一些章节来了,我不解地问:Javascript代码:它是如何工作的?

String.prototype.repeat = function (num) { 
    return new Array(num + 1).join(this); 
}; 

displayDate()方法从而使用:

var body = $('body')[0].outerHTML.repeat(10000); 

什么使用这段代码的重要性?

其次,在displayToday()方法中,使用参数调用displayDate()方法,尽管它没有被定义为采用arg。这是为什么?

我正在学习JS,不能npt把我的头围绕这些。欢迎任何帮助。

+0

你能粘贴代码或'displayToday()'和'displayDate()'确切的网址是什么? – Nathan 2013-05-03 20:59:42

+0

完整代码在这里http://jsfiddle.net/gabeno/3wbcB/第2,54和61行 – gabeno 2013-05-03 21:16:21

回答

4
String.prototype.repeat = function (num) { 
    return new Array(num + 1).join(this); 
}; 

此代码创建一个数组,它是在长度num+1,填充有undefined。然后使用join将其折叠为字符串,将每个未定义的值与上下文thisouterHTML字符串)分隔开。当一个数组被加入到一个字符串中时,undefined值就没有任何意义,因此生成的字符串只包含您的分隔符,这些分隔符会出现num次,从而“重复”字符串。

//let . be "undefined, which when turned into a string, is just nothing 
[u,u,u,...,u].join('test'); 
'(u)test(u)test(u)...(u)test' 
'testtest...test' 

至于第二个问题,在JS 功能将始终采取的参数,即使函数并不意味着拿一个。在JS中的函数中定义参数只是为传递的参数分配一个名称。参数将始终转到该函数,并被收集到一个特殊的数组中,该函数的变量为arguments

function fn(){ 
    console.log(arguments); //['hello','world']; 
} 

foo('hello','world'); 
+0

我已经添加到代码的链接:http://jsfiddle.net/gabeno/3wbcB/我想了解为什么使用DOM中的repeat()函数。它以什么方式改变DOM? – gabeno 2013-05-03 21:16:47

+0

@ gabeno它不会在你的代码中做任何事情。没有那个函数使用'body'。 – Joseph 2013-05-03 21:25:18

+0

感谢您的提升,虽然我觉得它可能只是某种填充黑客?也许是为了定位?进一步通过你的回答,我们需要通过'arguments'数组引用'args',但是从代码中没有引用这个数组呢?有小费吗? – gabeno 2013-05-03 21:41:15

1

即使您没有在声明中列出参数,也可以将参数传递给函数。你可以访问通过的参数arguments

function foo() { 
    console.log(arguments); 
} 

foo('bar'); // ['bar'] 
foo('bar','blerg'); // ['bar','blerg'] 
+0

谢谢@蜡笔小新。我知道了。 – gabeno 2013-05-03 21:42:20

1

这很简单。

当您更改prototype的某些内容(在本例中为默认String类)时,您可以将该方法用于该类的任何实例,在本例中为任何字符串。

现在我们来看看该方法的作用。

return new Array(num + 1).join(this); 

因为String.prototype.displayDate = function(num) {的,的this该函数内的值是字符串的值。 this参考指向当前对象,我想这是有道理的。

然后它创建一个num + 1元素的数组,它将全部使用undefined进行初始化。 Array.prototype.join返回由您提供的参数分隔的数组元素的字符串表示形式。

在这种情况下,您有一个num +1 undefined值的数组。 undefined的字符串表示形式为"",或空字符串。所以你最终得到了num + 1连接的空字符串+ thisnum的值。

说你的字符串是“test”,并且你打电话给repeat(2)

它首次创建a = new Array(undefined, undefined, undefined); // 2 + 1次。

然后它开始加入字符串,将“测试”放在每对之间。

new String(undefined) + new String("test") + new String(undefined); + new String("test") + new String(undefined) 

以上变为:

"" + "test" + "" + "test" + "" = "testtest"// two times the original string. 
+0

谢谢@ Alex23。我得到了流量。 – gabeno 2013-05-03 21:41:54