2017-05-29 104 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]的作用域。如果它只有一个参数,那么该函数的行为会有所不同,正如您的原始示例中那样。希望是有道理的! –