为什么这个Javascript代码返回undefined

时间:2017-06-28 18:37:07

标签: javascript

这是一个带有字符串的IIFE功能。内部函数不接受字符串参数,因为它在控制台

中打印undefined

//jshint esnext: true
    
(function(string) {
  var s = setTimeout((string) => {
    console.log(string);
  }, 1000);
})("Hello World!");

4 个答案:

答案 0 :(得分:5)

因为setTimeout()没有使用任何参数调用其回调函数:



(function(string) {
  var s = setTimeout(() => {
    console.log(string);
  }, 1000);
})("Hello World!");




或者,您可以将参数显式传递给回调函数,但这不是必需的:



(function(string) {
  var s = setTimeout((param) => {
    console.log(param);
  }, 1000, string);
})("Hello World!");




答案 1 :(得分:2)

string内的setTimeoutsetTimeout回调参数遮蔽。这可能会使您的代码目前正在做的更清楚:

(function(a) {
  var s = setTimeout((b) => {
    console.log(b);
  }, 1000);
})("Hello World!");

如果您要关闭a参数,那么就不要使用参数进行setTimeout回调:

(function(a) {
  var s = setTimeout(() => {
    console.log(a);
  }, 1000);
})("Hello World!");

答案 2 :(得分:1)

您正在将一个函数传递给setTimeout,该函数带有一个名为string的参数。

setTimeout在调用您的回调时没有传递任何参数,因此它会获得undefined

答案 3 :(得分:1)

根据官方documentation将任何参数传递给内部函数,您需要在delay值之后指定它:

  

setTimeout(function [,delay,param1,param2,...])



(function(s) {
  var id = setTimeout(function(param) {
    console.log(param);
  }, 1000, s);
})("Hello World!");




建议始终定义传递的参数,因为外部范围变量值可能会在代码中稍后更改:



(function(s) {
  var id = setTimeout(function() {
    console.log(s);
  }, 1000);
  s = "Bye Bye";
})("Hello World!");