Javascript代码:它是如何工作的?

3

我最近完成了DevTools ~> http://discover-devtools.codeschool.com/ 课程,在检查所使用的代码时,我发现了一些我不理解的部分:

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

displayDate()方法中使用:

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

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

其次,在displayToday()方法中,虽然未定义接受参数,但会调用displayDate()方法并传递参数。为什么会这样呢?

我正在学习JS,但对这些内容感到困惑。欢迎任何帮助。


你能贴上"displayToday()"和"displayDate()"的代码或确切的URL吗? - Nathan
完整代码在这里 http://jsfiddle.net/gabeno/3wbcB/,第2、54和61行。 - gmajivu
3个回答

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

这段代码创建一个长度为num+1的数组,数组中的每个值都为undefined。接着使用join方法将其转换成字符串,使用上下文this(即outerHTML字符串)作为分隔符来连接每个undefined值。当将数组连接成字符串时,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');

我已经添加了代码链接:http://jsfiddle.net/gabeno/3wbcB/。我正在尝试理解为什么在DOM中使用repeat()函数。它以何种方式改变DOM? - gmajivu
@gabeno 在你的代码中它没有作用。那个函数里面没有使用body - Joseph
感谢提醒,不过我觉得这可能只是一种填充攻击?也许是用于定位的?根据你的答案,我们需要通过arguments数组引用args,但是从代码中并没有对该数组的引用?有什么建议吗? - gmajivu
@gabeno arguments 是函数默认提供的,可以直接访问。可以将其视为预先提供的不可见变量。此外,它并不是真正的数组,但可以将其转换为数组。 - Joseph
谢谢 @JosephTheDreamer,你真的能够翻译代码!! - gmajivu
@gabeno 我能读懂它们,但不知道它们具体做什么。最好的方法是运行它们。 - Joseph

1
即使在声明中没有列出参数,您仍然可以向函数传递参数。您可以使用arguments访问传递的参数。
function foo () {
  console.log(arguments);
}

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

1
很简单。 当您更改某个东西的原型时,即默认的String类,在这种情况下,您使该方法对该类的任何实例(在这种情况下是任何字符串)都可用。 现在让我们看看该方法的作用。
return new Array(num + 1).join(this);

由于String.prototype.displayDate = function(num) {,函数内的this指向字符串的值。 this引用指向当前对象,我想这是有道理的。
然后它创建一个num + 1元素的数组,并且所有这些元素都将被初始化为undefinedArray.prototype.join返回由你提供的参数分隔的数组元素的字符串表示形式。
在这种情况下,您有一个由num + 1个undefined值组成的数组。 undefined的字符串表示形式为"",即为空字符串。 因此,您最终将得到空字符串+ this值的num + 1个连接,或者说是你的字符串num次。
假设您的字符串是“test”,并调用repeat(2)
首先,它创建了a = new Array(undefined, undefined, undefined); // 2 + 1 times。
然后它开始连接字符串,将“test”放在每对中间。
new String(undefined) + new String("test") + new String(undefined); + new String("test") + new String(undefined)

以上变为:
"" + "test" + "" + "test" + "" = "testtest"// two times the original string.

谢谢@Alex23。我明白了流程。 - gmajivu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接