2017-01-20 63 views
0

我很困惑setTimeout方法与JS一起工作的方式。 为什么当我调用firstFunction时,setTimeout只运行一次,当我调用第二个函数时,它一直调用该函数。setTimeout JS继续运行

我期望一致性。第一个函数setTimeout将继续调用第二个函数中的日志函数OR,setTimeout只会调用第二个函数并结束。

var firstFunction = function(){ 
    var log = console.log('hello') 
    setTimeout(log, 2000); 
} 

firstFunction(); 

var secondFunction = function(str){ 
    console.log(str) 
    setTimeout("secondFunction('test')", 2000); 
} 

secondFunction('test'); 
+2

因为'secondFunction'调用'secondFunction'在setTimeout的 - 但'firstFunction'调用函数'log'(无论是)在setTimeout –

+0

超时只是 - *超时*。他们不会无限期地运行(直到你清除他们),他们运行**一次**。在第二个例子中,超时调用函数本身,它模拟* interval *('setInterval')的效果并无限期调用。 – Li357

+0

同样在你的第一个例子中,'console.log'不会返回任何东西,所以你的超时设置不正确 – Li357

回答

2

第一个片段不正确。 console.log('hello')立即运行,并且超时不会触发任何事情,因为在您的示例中logundefined

这里是一个工作示例会是什么样子:

var firstFunction = function(){ 
 
    var log = function() { console.log('hello'); }; 
 
    setTimeout(log, 2000); 
 
} 
 

 
firstFunction();

第二片断循环永远,因为你告诉它做到以下几点:

1)运行声明secondFunction('test')

2)记录参数并设置超时2秒。

3)一旦在超时结束时,运行该语句secondFunction('test')

4)登录的参数和设定的超时2秒。

5)一旦超时结束,运行该语句secondFunction('test')

...

N)不断重复的

var secondFunction = function(str){ 
 
    console.log(str) 
 
    setTimeout("secondFunction('test')", 2000); 
 
} 
 

 
secondFunction('test');

请注意,在第一个例子,超时不会再次调用firstFunction,它会调用一个名为的函数和log不会创建另一个超时回调,因此它只运行一次。

**编辑 - 如何调用它不使用字符串作为函数参数? **

此外,它可能不是更可取的字符串调用此。使用对函数的引用来调用它。这在第一个例子中演示,其中函数log被声明并传入setTimeout。但你也可以这样来做:

var thirdFunction = function(){ 
 
    setTimeout(function() { console.log('Hello World'); }, 1000); 
 
} 
 

 
thirdFunction();

+0

我明白了。欣赏那....还有什么办法我可以编码,所以我不需要把函数放在一个字符串? –

+0

请参阅更新以回答问题,示例1和3演示如何不使用字符串来调用它。 – GantTheWanderer

+0

我很好奇,如果你可以请解释调用它使用一个字符串和调用它使用函数的引用之间的区别 –