我正在学习JavaScript,最近又了解了JavaScript计时事件。当我setTimeout
在W3Schools学习时,我注意到一个我从未遇到过的奇怪人物。他们使用双引号,然后调用该函数。
例:
setTimeout("alertMsg()", 3000);
我知道JavaScript中的双引号和单引号表示一个字符串。
我也看到我可以做同样的事情:
setTimeout(alertMsg, 3000);
有括号的是指,没有括号的是复制的。当我使用引号和括号时,它越来越疯狂了。
如果有人可以向我解释这三种使用方式之间的区别,我将感到非常高兴setTimeout
:
加上括号:
setTimeout("alertMsg()", 3000);
没有引号和括号:
setTimeout(alertMsg, 3000);
第三只使用引号:
setTimeout("alertMsg", 3000);
注意:最好的setTimeout
参考来源是MDN。
使用setInterval
或setTimeout
您应该传递对函数的引用作为setTimeout
或的第一个参数setInterval
。该参考可以采用以下形式:
-
匿名功能
setTimeout(function(){/* Look mah! No name! */},2000);
-
现有功能的名称
function foo(){...} setTimeout(foo, 2000);
-
指向现有功能的变量
var foo = function(){...}; setTimeout(foo, 2000);
请注意,我将“函数中的变量”与“函数名”分开设置。变量和函数名称占用相同的名称空间并相互破坏,这一点并不明显。
传递参数
要调用函数并传递参数,可以在分配给计时器的回调内部调用函数:
setTimeout(function(){
foo(arg1, arg2, ...argN);
}, 1000);
还有另一种将参数传递给处理程序的方法,但是它与跨浏览器不兼容。
setTimeout(foo, 2000, arg1, arg2, ...argN);
回调上下文
默认情况下,执行时回调的上下文(this
计时器调用的函数内部的值)为global object window
。如果要更改它,请使用bind
。
setTimeout(function(){
this === YOUR_CONTEXT; // true
}.bind(YOUR_CONTEXT), 2000);
安全
尽管有可能,但您不应将字符串传递给setTimeout
或setInterval
。传递字符串可以使setTimeout()
或setInterval()
使用类似于将字符串作为脚本执行的功能,从而eval()
可以执行任意的且可能有害的脚本。
我认为您编写的setTimeout函数未运行。如果使用jquery,可以通过执行以下操作使其正确运行:
function alertMsg() {
//your func
}
$(document).ready(function() {
setTimeout(alertMsg,3000);
// the function you called by setTimeout must not be a string.
});
完全同意约瑟夫。
这是一个测试这个的小提琴:http : //jsfiddle.net/nicocube/63s2s/
在小提琴音乐中,我认为字符串参数不起作用,因为该函数未在全局范围内定义。
如果您将字符串作为函数的第一个参数传递,实际发生的情况
setTimeout(
'string'
,number
)
是在运行时间(经过number
毫秒后)时评估的第一个参数的值。基本上等于
setTimeout(
eval('string')
,number
)
这是
一种替代语法,允许您包括字符串而不是函数,该函数在计时器到期时进行编译和执行。不建议使用此语法,其原因与使用eval()构成安全风险的原因相同。
因此,您引用的样本不是很好的样本,可能在不同的上下文中给出或只是简单的错字。
如果您这样调用setTimeout(something, number)
,则第一个参数不是字符串,而是指向的指针something
。再次,如果something
是字符串-那么它将被评估。但是,如果是函数,则将执行函数。
jsbin示例
##If i want to wait for some response from server or any action we use setTimeOut.
functionOne =function(){
console.info("First");
setTimeout(()=>{
console.info("After timeOut 1");
},5000);
console.info("only setTimeOut() inside code waiting..");
}
functionTwo =function(){
console.info("second");
}
functionOne();
functionTwo();
## So here console.info("After timeOut 1"); will be executed after time elapsed.
Output:
*******************************************************************************
First
only setTimeOut() inside code waiting..
second
undefined
After timeOut 1 // executed after time elapsed.
加上括号:
setTimeout("alertMsg()", 3000); // It work, here it treat as a function
没有引号和括号:
setTimeout(alertMsg, 3000); // It also work, here it treat as a function
第三只使用引号:
setTimeout("alertMsg", 3000); // It not work, here it treat as a string
function alertMsg1() {
alert("message 1");
}
function alertMsg2() {
alert("message 2");
}
function alertMsg3() {
alert("message 3");
}
function alertMsg4() {
alert("message 4");
}
// this work after 2 second
setTimeout(alertMsg1, 2000);
// This work immediately
setTimeout(alertMsg2(), 4000);
// this fail
setTimeout('alertMsg3', 6000);
// this work after 8second
setTimeout('alertMsg4()', 8000);
在上面的示例中,在该alertMsg1()(等待2秒的时间)之后,首先立即调用alertMsg2()函数(我们给超时4S,但它不会打扰),然后调用alertMsg4()(等待8秒的时间)但是alertMsg3()无法正常工作,因为我们将其放在引号中,没有相关各方,因此将其视为字符串。
文章标签:javascript , settimeout
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!