2017-05-29 65 views
0

我理解此代碼的工作:JavaScript調用()方法

var links = document.querySelectorAll('div'); 
for (var i = 0; i < links.length; i++) { 
    (function(){ 
     console.log(this); 
    }).call(links[i]); 
} 

但爲什麼這項工作:

var links = document.querySelectorAll('div'); 
for (var i = 0; i < links.length; i++) { 
    console.log.call(this, links[i]); 
} 

應該是窗口對象調用每一個的情況下迭代?

+0

顯然,無論'this'是'console.log'不重要 –

+0

@JaromandaX其實我覺得你可能是錯的。我記得'console.log'很奇怪。 –

+0

@BartekBanachewicz - 不久前,'this'必須是'console'對象 - 但是,這些天它不會 –

回答

0

這也從調用

var links = document.querySelectorAll('div'); 
for (var i = 0; i < links.length; i++) { 
    console.log(links[i]); 
} 

你是對的,在此範圍內的this關鍵字被綁定到window對象的不同,如果你運行的片段波紋管,你可以看到,我追加新的屬性SomeUniqueValue到使用call功能時在外觀範圍內可以訪問的窗口對象。

現在,如果您將該塊封裝在一個函數中,您可以看到this關鍵字僅限於調用塊的範圍,因此在最後一個示例中只有span被記錄到控制檯。

var links = document.querySelectorAll('div'); 
 
for (var i = 0; i < links.length; i++) { 
 
    console.log(links[i]); 
 
} 
 

 
window.SomeUniqueValue = "WAWAWIWA"; 
 
for (var i = 0; i < links.length; i++) { 
 
    console.log.call(this, SomeUniqueValue); 
 
} 
 

 
var someFunction = function() { 
 
    'use strict'; 
 
    var links = document.querySelectorAll('span'); 
 
    for (var i = 0; i < links.length; i++) { 
 
     console.log.call(this, links[i]); 
 
    } 
 
} 
 

 
someFunction();
<div>This</div> 
 
<div>Works</div> 
 
<div>Fine</div> 
 
<span>Inner Scope</span>

+0

謝謝,現在我想讓我困惑的部分是爲什麼我不能這樣稱呼它: 'console.log.call(links [i],this)' 是否可以將鏈接[i]設置爲此,還是我缺乏關於一些基本的javascript概念的知識? –

+0

你不能這樣調用它,因爲函數需要第一個參數來定義上下文,那麼下面的參數就是你傳遞給Console.Log函數的參數,所以通過調用它你會做一些事情像console.log(this)這裏綁定到l [i]的作用域。如果它只有一個參數,那麼該函數的行爲會有所不同,正如您的原始示例中那樣。希望是有道理的! –