这是一个带有字符串的IIFE功能。内部函数不接受字符串参数,因为它在控制台
中打印undefined
//jshint esnext: true
(function(string) {
var s = setTimeout((string) => {
console.log(string);
}, 1000);
})("Hello World!");
答案 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
内的setTimeout
被setTimeout
回调参数遮蔽。这可能会使您的代码目前正在做的更清楚:
(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!");