Javascript(글로벌 변수 포함)의 변수 선언 구문의 차이는?
변수를 선언하는 것과 차이가 있습니까?
var a=0; //1
...이쪽:
a=0; //2
...또는:
window.a=0; //3
글로벌 범위 내에서요?
네, 몇 가지 차이점이 있지만 실제적인 측면에서는 큰 차이가 없습니다.
네 번째 방법이 있습니다. ES2015(ES6)에서는 두 가지 방법이 더 있습니다.마지막에는 네 번째 방법을 추가했지만, #1 뒤에 ES2015를 삽입했습니다(이유는 곧 알게 될 것입니다).이렇게 하면 다음과 같은 이점이 있습니다.
var a = 0; // 1
let a = 0; // 1.1 (new with ES2015)
const a = 0; // 1.2 (new with ES2015)
a = 0; // 2
window.a = 0; // 3
this.a = 0; // 4
그 진술들은 설명되었다.
#1var a = 0;
그러면 글로벌 변수가 생성되고 글로벌 객체의 속성이기도 합니다.이러한 변수는window
"visor" 경유)this
글로벌 스코프(비표준 코드). 특성과는 이 be unlike unlike른른른른른른른른 unlike unlike를 통해 제거할 수 없습니다.delete
.
사양 용어로는 글로벌 환경의 개체 환경 레코드에 식별자 바인딩을 생성합니다.글로벌 개체는 글로벌 환경의 개체 환경 레코드에 대한 식별자 바인딩이 저장되기 때문에 이 속성은 글로벌 개체의 속성이 됩니다.따라서 속성을 삭제할 수 없습니다.단순한 속성이 아니라 식별자 바인딩입니다.
의 첫 실행되기 됩니다(「When 」(「 」(「When」) 참조var
(어느쪽이든)
에서는 IE8에서 입니다.window
는 열거할 수 없습니다(에 표시되지 않습니다).for..in
이치노IE9, Chrome, Firefox 오페라
#1.1let a = 0;
그러면 글로벌 객체의 속성이 아닌 글로벌 변수가 생성됩니다.이것은 ES2015에서 새로운 것입니다.
사양 용어에서는 개체 환경 레코드가 아닌 글로벌 환경의 선언적 환경 레코드에 식별자 바인딩을 생성합니다.글로벌 환경은 글로벌 객체(오브젝트 환경 레코드)에 있는 모든 오래된 것(오브젝트 환경 레코드)과 새로운 모든 것(오브젝트 환경 레코드)에 대해 분할된 환경 레코드를 가지고 있다는 점에서 독특합니다.let
,const
에 의해 class
글로벌 오브젝트에는 포함되지 않습니다.
바인딩은 엔클로징 블록의 단계별 코드가 실행되기 전에 작성되지만(이 경우 글로벌코드가 실행되기 전), 단계별 실행이 다음 단계에 도달할 때까지 어떤 방법으로도 액세스할 수 없습니다.let
이 행 the the에 let
「언제」를참조해 주세요let
★★★★★★★★★★★★★★★★★」const
occurrent는 다음과 같습니다
#1.2const a = 0;
글로벌 객체의 속성이 아닌 글로벌 상수를 만듭니다.
const
닮다let
이니셜라이저)를 지정해야 합니다.= value
및 생성되면 값을 할 수 .part).이불을 덮고 있으면 마치let
그러나 ID 바인딩에 값을 변경할 수 없다는 플래그가 표시됩니다.「」를 사용합니다.const
세 를 해 .
- 상수에 할당하려고 하면 해석 시간 오류가 발생합니다.
- 다른 프로그래머를 위해 변하지 않는 특성을 문서화합니다.
- JavaScript 엔진이 변경되지 않도록 최적화합니다.
#2a = 0;
그러면 암시적으로 글로벌개체에 속성이 생성됩니다.일반 속성이기 때문에 삭제할 수 있습니다.이렇게 하지 않는 것이 좋습니다. 나중에 코드를 읽는 사람은 분명하지 않을 수 있습니다.ES5의 strict 모드를 사용하는 경우 존재하지 않는 변수에 할당하는 것은 오류가 됩니다.이것은 strict 모드를 사용하는 여러 가지 이유 중 하나입니다.
그리고 흥미롭게도 IE8 및 그 이전 버전에서도 생성된 속성은 열거할 수 없습니다(에는 표시되지 않음).for..in
이치노번번번 、 번번 、 3 。
#3window.a = 0;
글로벌 오브젝트에 됩니다.window
오브젝트를 브라우저에서는 비브라우저 에서는 "global(global)" 등 변수가 있습니다. 일부 비브라우저 환경에는 다음과 같은 동등한 글로벌 변수가 있습니다.global
(NodeJS).일반 속성이기 때문에 삭제할 수 있습니다.
이 속성은 IE8 이전 버전 및 내가 사용해 본 다른 모든 브라우저에서 열거할 수 있습니다.
#4this.a = 0;
3번으로 것만 this
「」window
strict 에서는 strict가 됩니다this
에 대한 참조가 이값이 ).undefined
★★★★★★★★★★★★★★★★★★」
속성 삭제 중
는 이죠?a
그것: (완전) 속성을 완전히 delete
★★★★★★★★★★★★★★★★★★:
window.a = 0;
display("'a' in window? " + ('a' in window)); // displays "true"
delete window.a;
display("'a' in window? " + ('a' in window)); // displays "false"
delete
이치노요.window
var
, . . . . . . . .delete
(JavaScript 구현 및 strict 모드 여부에 따라 다름)는 자동으로 무시되거나 예외를 발생시킵니다.
경고: IE8은 다시 (아마도 이전 버전이고 IE9-IE11은 고장난 "호환성" 모드일 것입니다)의 속성을 삭제할 수 없습니다.window
심지어 허락을 받아야 할 때에도, 반대합니다.게다가 IE8이나 다른 브라우저에서도 이 실험을 시도하면 예외가 발생합니다.그래서 에서 삭제할 때window
오브젝트, 방어적이어야 합니다.
try {
delete window.prop;
}
catch (e) {
window.prop = undefined;
}
이 삭제되다로 됩니다.undefined
.
이는 다음에만 해당됩니다.window
IE8은 IE9-IE11에 대응하고 있습니다..window
위의 규칙에 따라 속성을 지정합니다.
var
에서 var
실행 컨텍스트의 단계별 코드가 실행되기 전에 스테이트먼트가 생성되기 때문에 속성이 존재하기 전에var
★★★★★★ 。
혼란스러울 수 있으므로 다음 사항을 살펴보겠습니다.
display("foo in window? " + ('foo' in window)); // displays "true"
display("window.foo = " + window.foo); // displays "undefined"
display("bar in window? " + ('bar' in window)); // displays "false"
display("window.bar = " + window.bar); // displays "undefined"
var foo = "f";
bar = "b";
display("foo in window? " + ('foo' in window)); // displays "true"
display("window.foo = " + window.foo); // displays "f"
display("bar in window? " + ('bar' in window)); // displays "true"
display("window.bar = " + window.bar); // displays "b"
라이브 예:
display("foo in window? " + ('foo' in window)); // displays "true"
display("window.foo = " + window.foo); // displays "undefined"
display("bar in window? " + ('bar' in window)); // displays "false"
display("window.bar = " + window.bar); // displays "undefined"
var foo = "f";
bar = "b";
display("foo in window? " + ('foo' in window)); // displays "true"
display("window.foo = " + window.foo); // displays "f"
display("bar in window? " + ('bar' in window)); // displays "true"
display("window.bar = " + window.bar); // displays "b"
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
보다시피 심볼은foo
첫 번째 줄 , 기호 " " " " " 는 " " " 입니다.bar
에요?var foo = "f";
스테이트먼트는, 실제로는, 2개의 것이 있습니다.코드의 첫 번째 행이 실행되기 전에 발생하는 심볼 정의와 그 행이 스텝 바이 스텝 플로우에 있는 곳에서 발생하는 심볼 할당입니다.을 '이렇게 하다'라고 var
'호이스트는 '호이스트'이기 때문에var foo
, 'Hoicted"는foo = "f"
부품이 원래 위치에 남아 있습니다.(빈곤한 블로그의 Poor 오해 참조)
let
★★★★★★★★★★★★★★★★★」const
let
★★★★★★★★★★★★★★★★★」const
var
몇 가지 방법으로요이 질문과 관련된 방법은 정의된 바인딩이 단계별 코드가 실행되기 전에 생성되지만 이 바인딩에 액세스하려면let
★★★★★★★★★★★★★★★★★」const
스테이트먼트에 도달했습니다.
실행 중:
display(a); // undefined
var a = 0;
display(a); // 0
그러면 다음 오류가 발생합니다.
display(a); // ReferenceError: a is not defined
let a = 0;
display(a);
두 방법let
★★★★★★★★★★★★★★★★★」const
var
이 없는 질문입니다
var
는 항상 또는 에, 「」는 「글로벌코드 전체」를 참조해 주세요.let
★★★★★★★★★★★★★★★★★」const
블록 내에서만 적용됩니다.그것은,var
글로벌) 범위가 만, 「」( 「」)는 .let
★★★★★★★★★★★★★★★★★」const
블록 스코프가 있습니다.★★의
var a
하지만, 「」가 있는 는, 「」를 참조해 주세요.let a
(오류)const a
것을let a
★★★const a
★★★var a
는 구문 오류입니다.
는 ''는 것을 하는 것입니다.let
★★★★★★★★★★★★★★★★★」const
블록 의 코드가 실행되기 에 해당 블록 내의 코드가 실행되기 전에는 수 let
★★★★★★★★★★★★★★★★★」const
★★★★★★★★
var a = 0;
console.log(a);
if (true)
{
console.log(a); // ReferenceError: a is not defined
let a = 1;
console.log(a);
}
번째 " " "는console.log
접속하지 에 합니다.a
그 블록 밖에서요
글로벌오브젝트를 을 피한다.window
)
window
오브젝트는 속성으로 인해 매우 어수선해집니다.가능하면 난장판을 추가하지 말 것을 강력히 권장합니다.대신 심볼을 작은 패키지로 포장하여 최대 1개의 심볼로 내보냅니다.window
오브젝트. (나는 종종 어떤 기호도 내보내지 않습니다.window
★★★★★★ 모든 수 있습니다.또, 그 다음의 으로 할 수 있습니다.기호를 포함하기 위해 모든 코드를 포함하는 함수를 사용할 수 있습니다. 이 함수는 다음과 같은 경우 익명일 수 있습니다.
(function() {
var a = 0; // `a` is NOT a property of `window` now
function foo() {
alert(a); // Alerts "0", because `foo` can access `a`
}
})();
예에서는 )합니다.()
( 막た )
이와 같이 사용되는 함수를 흔히 범위 지정 함수라고 합니다.범위 지정 함수 내에서 정의된 함수는 해당 데이터에 대한 닫힘이기 때문에 범위 지정 함수에 정의된 변수에 액세스할 수 있습니다( 참조: 빈혈 상태의 블로그에서는 닫힘이 복잡하지 않습니다).
단순성 유지:
a = 0
위의 코드는 전역 범위 변수를 제공합니다.
var a = 0;
이 코드는 현재 범위와 그 아래에 사용할 변수를 제공합니다.
window.a = 0;
이것은 일반적으로 글로벌 변수와 동일합니다.
<title>Index.html</title>
<script>
var varDeclaration = true;
noVarDeclaration = true;
window.hungOnWindow = true;
document.hungOnDocument = true;
</script>
<script src="external.js"></script>
/* external.js */
console.info(varDeclaration == true); // could be .log, alert etc
// returns false in IE8
console.info(noVarDeclaration == true); // could be .log, alert etc
// returns false in IE8
console.info(window.hungOnWindow == true); // could be .log, alert etc
// returns true in IE8
console.info(document.hungOnDocument == true); // could be .log, alert etc
// returns ??? in IE8 (untested!) *I personally find this more clugy than hanging off window obj
기본적으로 모든 변수에서 제외되는 전역 개체가 있습니까?예: 'globals.noVar 선언'
T.J. Crowder의 훌륭한 답변에 근거합니다. (오프토픽: 어수선하지 않다)
다음은 그의 아이디어의 예입니다.
HTML
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="init.js"></script>
<script type="text/javascript">
MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
</script>
<script src="script.js"></script>
</head>
<body>
<h1>Hello !</h1>
</body>
</html>
var MYLIBRARY = MYLIBRARY || (function(){
var _args = {}; // private
return {
init : function(Args) {
_args = Args;
// some other initialising
},
helloWorld : function(i) {
return _args[i];
}
};
}());
script.discripts.discripts: 스크립트
// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);
alert(a);
여기 있습니다.도움이 되었으면 좋겠다!
글로벌 범위에서는 의미상의 차이가 없습니다.
한다.a=0
값을 선언되지 않은 변수로 설정했기 때문입니다.
또한 전체 범위를 편집하지 않으려면 닫기를 사용하십시오.
(function() {
// do stuff locally
// Hoist something to global scope
window.someGlobal = someLocal
}());
꼭 필요할 때는 항상 폐쇄를 사용하고 항상 글로벌 범위로 올리십시오.통신의 대부분은 비동기 이벤트 처리를 사용해야 합니다.
@@AvianMoncellor에 .var a = foo
이치노이것은 IE의 악명 높은 고장난 인터프리터 문제입니다.이 버그는 귀에 익은 것 같기 때문에 아마 사실일 것입니다.
★★★★★★★★★★★★★★★★★★★★★★★★★★window.globalName = someLocalpointer
언급URL : https://stackoverflow.com/questions/4862193/difference-between-variable-declaration-syntaxes-in-javascript-including-global
'sourcecode' 카테고리의 다른 글
텍스트 파일을 수정하는 방법 (0) | 2023.01.10 |
---|---|
JSON 오브젝트 작성 방법 (0) | 2023.01.10 |
perl - 2개의 데이터베이스에서 2개의 SQL 쿼리로 이루어진 2개의 열을 비교합니다. (0) | 2022.12.26 |
org.codehouse.com과 com.codexml.core의 비교 (0) | 2022.12.26 |
python을 사용하여 csv에 mysql 쿼리를 쓰는 경우 필드 이름을 표시해야 합니다. (0) | 2022.12.26 |