고급 JavaScript :이 함수는 왜 괄호로 묶입니까? [복제]
나는이 비트의 JavaScript 코드를 발견했지만 그 코드로 무엇을 만들어야할지 전혀 모른다. 이 코드를 실행할 때 왜 "1"이 표시됩니까? 이 이상한 작은 부록 (1)은 무엇이며 왜 함수가 괄호로 묶여 있습니까?
(function(x){
delete x;
return x;
})(1);
여기에 몇 가지 일이 있습니다. 첫 번째는 즉시 호출 된 함수 표현식 (IIFE) 패턴입니다.
(function() {
// Some code
})();
이를 통해 자체 범위에서 일부 JavaScript 코드를 실행할 수 있습니다. 일반적으로 함수 내에서 생성 된 모든 변수가 전역 범위에 영향을 미치지 않도록 사용됩니다. 대신 이것을 사용할 수 있습니다 :
function foo() {
// Some code
}
foo();
그러나이를 위해서는 함수에 이름을 지정해야합니다. 항상 필요한 것은 아닙니다. 명명 된 함수를 사용한다는 것은 미래의 시점에서 함수를 다시 호출하여 바람직하지 않을 수도 있음을 의미합니다. 이런 방식으로 익명 함수를 사용하면 한 번만 실행됩니다.
이 구문은 유효하지 않습니다 :
function() {
// Some code
}();
함수를 표현식으로 구문 분석하려면 함수를 괄호로 묶어야합니다. 자세한 정보는 여기에 있습니다 : http://benalman.com/news/2010/11/immediately-invoked-function-expression/
따라서 IIFE 패턴을 빠르게 요약하면 다음과 같습니다.
(function() {
// Some code
})();
'일부 코드'가 마치 인라인으로 작성된 것처럼 자체 범위 내에서 즉시 실행되어 글로벌 네임 스페이스에 영향을 미치지 않도록하여 (따라서 다른 스크립트를 방해하거나 방해 할 수 있음) 허용합니다.
예를 들어, 일반적인 함수처럼 함수에 인수를 전달할 수 있습니다.
(function(x) {
// Some code
})(1);
따라서 함수의 첫 번째 인수로 '1'값을 전달합니다.이 인수는 값을 x라는 로컬 범위 변수로받습니다.
두 번째로 함수 코드 자체의 장점이 있습니다.
delete x;
return x;
삭제 연산자는 객체에서 속성을 제거합니다. 변수를 삭제하지 않습니다. 그래서;
var foo = {'bar':4, 'baz':5};
delete foo.bar;
console.log(foo);
이 결과가 기록됩니다.
{'baz':5}
이므로,
var foo = 4;
delete foo;
console.log(foo);
foo는 속성이 아닌 변수이므로 삭제할 수 없으므로 값 4를 기록합니다.
많은 사람들이 autoglobals가 작동하는 방식 때문에 delete가 변수를 삭제할 수 있다고 가정합니다. 변수를 먼저 선언하지 않고 할당하면 실제로 변수가 아니라 전역 객체의 속성이됩니다.
bar = 4; // Note the lack of 'var'. Bad practice! Don't ever do this!
delete bar;
console.log(bar); // Error - bar is not defined.
This time the delete works, because you're not deleting a variable, but a property on the global object. In effect, the previous snippet is equivalent to this:
window.bar = 4;
delete window.bar;
console.log(window.bar);
And now you can see how it's analogous to the foo object example and not the foo variable example.
It means you created an anonymous function, and call it with parameter 1
.
It is just the same as:
function foo(x) {
delete x;
return x;
}
foo(1);
The reason that you still get 1 returned is that the delete keyword is for removing properties of objects. The rest is as others have commented, anything wrapped in brackets executes as a function, and the second set of brackets are the arguments passed to that block.
Here's the MDN reference for delete, and the MDN reference for closures, which discusses also anonymous functions.
People normally call these "Immediately Invoked Function Expressions" or "Self Executing Functions".
The point of doing this is that variables declared inside that function do not leak to the outside.
'Programing' 카테고리의 다른 글
PHP에서 MySQL 정수 필드가 문자열로 반환됩니다 (0) | 2020.07.21 |
---|---|
“JSX 요소 유형 '…'에 구성 또는 호출 서명이 없습니다. '오류는 무엇을 의미합니까? (0) | 2020.07.21 |
#if 0… #endif 블록은 정확히 무엇을합니까? (0) | 2020.07.21 |
JOIN 조건에서 CASE 문을 사용할 수 있습니까? (0) | 2020.07.21 |
htmlspecialchars 및 mysql_real_escape_string은 PHP 코드를 주입으로부터 안전하게 유지합니까? (0) | 2020.07.21 |