따옴표와 괄호가 있는 경우와 없는 경우의 set Timeout의 차이
저는 자바스크립트를 배우고 있으며 최근에 자바스크립트 타이밍 이벤트에 대해 배웠습니다.제가 알게 됐을 때setTimeout
W3 스쿨에서, 나는 전에 마주치지 않았던 이상한 모습을 발견했다.큰따옴표를 사용하고 함수를 호출합니다.
예:
setTimeout("alertMsg()", 3000);
JavaScript에서 큰따옴표와 작은따옴표가 문자열을 의미한다는 것을 알고 있습니다.
저도 그렇게 할 수 있다는 걸 알았어요.
setTimeout(alertMsg, 3000);
괄호가 있으면 참조하고 괄호가 없으면 복사됩니다.따옴표와 괄호를 사용하면 난리가 납니다.
이 세 가지 사용방법의 차이점을 설명해주시면 감사하겠습니다.setTimeout
:
괄호 포함:
setTimeout("alertMsg()", 3000);
따옴표와 괄호 없이:
setTimeout(alertMsg, 3000);
세 번째는 인용문만 사용하는 것입니다.
setTimeout("alertMsg", 3000);
N.B.: 더 나은 정보원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
타이머에 의해 호출되는 함수의 내부)는 실행 시 글로벌 객체입니다.window
변경하실 경우 를 사용해 주세요.bind
.
setTimeout(function(){
this === YOUR_CONTEXT; // true
}.bind(YOUR_CONTEXT), 2000);
보안.
가능하지만 스트링을 넘겨서는 안 됩니다.setTimeout
또는setInterval
끈을 넘기면setTimeout()
또는setInterval()
스크립트로 문자열을 실행하는 것과 유사한 기능을 사용하여 임의적이고 잠재적으로 유해한 스크립트 실행을 가능하게 합니다.
작성한 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/
fielen의 문맥에서 string 인수는 기능하지 않습니다.이것은 함수가 글로벌스코프에서 정의되어 있지 않기 때문입니다.
함수 첫 번째 매개 변수로 문자열을 전달한 경우 실제로 발생하는 현상
Timeoutset Timeout())
'string'
,number
)
실행 (이후)에 평가된 첫 입니다.number
으로는 이 은 이 값과 .
Timeoutset Timeout())
eval('string')
,number
)
이것은
타이머가 만료되었을 때 컴파일되어 실행되는 함수 대신 문자열을 포함할 수 있는 대체 구문입니다.이 구문은 eval()을 사용하는 것이 보안상의 위험이 되는 것과 같은 이유로 권장되지 않습니다.
따라서 당신이 참조하는 샘플은 좋은 샘플이 아니며 다른 맥락에서 제공되거나 단순한 오타일 수 있습니다.
setTimeout(something, number)
문자열이 포인터입니다.이러한 는 스트링이 아니라 입니다.something
그리고 다시 한 번 말씀드리지만something
is string - 그러면 평가됩니다.그러나 함수일 경우 함수가 실행됩니다.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);
위의 예에서는 첫 번째 alertMsg2() 함수 호출이 alertMsg1() (2초의 타임웨이트)이후 즉시 실행되며 alertMsg4() (8초의 타임웨이트)가 실행되지만 alertMsg3()는 당사자 없이 따옴표 안에 배치되어 문자열로 처리되기 때문에 동작하지 않습니다.
언급URL : https://stackoverflow.com/questions/10312963/difference-between-settimeout-with-and-without-quotes-and-parentheses
'programing' 카테고리의 다른 글
임의의 베이스에서 정수를 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2022.10.02 |
---|---|
java: 지정된 초수 후에 함수를 실행합니다. (0) | 2022.10.02 |
SQL: 행 순서 위치를 변경하는 방법 (0) | 2022.10.02 |
utf8_bin과 latin1_general_cs의 차이점은 무엇입니까? (0) | 2022.10.02 |
line by line c - Linux ubuntu에서의 c++ 코드 디버깅 (0) | 2022.10.02 |