2013-05-03 55 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