development

'var'을 사용하여 변수를 선택적으로 선언합니까?

big-blog 2020. 3. 1. 15:58
반응형

'var'을 사용하여 변수를 선택적으로 선언합니까? [복제]


"var"은 선택 사항입니까?

myObj = 1;

?와 동일

var myObj = 1;

둘 다 내 테스트에서 작동한다는 것을 알았습니다 var. 선택적 이라고 가정 합니다. 맞습니까?


그것들은 다른 것을 의미합니다. var변수 를 사용 하면 해당 범위 내에서 선언됩니다 (예 : 함수). 을 사용하지 않으면 var변수는 주어진 이름 또는 전역 객체 (브라우저에서 수행하는 경우 창)에 따라 변수가 발견 될 때까지 범위의 레이어를 통해 버블 링됩니다. 그런 다음 전역 변수 와 매우 유사 합니다. 그러나 여전히 delete(사용하지 않은 다른 사람의 코드에 의해) 으로 삭제할 수 있습니다 var. 당신이 사용하는 경우 var전역 범위에서 변수입니다 진정한 글로벌 삭제할 수 없습니다.

이것은 제 생각에 자바 스크립트에서 가장 위험한 문제 중 하나이며 더 이상 사용되지 않거나 경고에 대해 경고를 제기해야합니다. 그 이유는 var실수로 전역 객체에 바인딩 된 공통 변수 이름 을 잊어 버릴 수 있기 때문입니다 . 이로 인해 이상하고 디버그하기 어려운 동작이 발생합니다.


이것은 Javascript의 까다로운 부분 중 하나이지만 핵심 기능 중 하나입니다. 로 선언 된 변수는 var"생명 시작"으로 선언 된 변수 입니다. 를 생략하면 var이전에 사용한 변수에 대해 이야기하는 것과 같습니다.

var foo = 'first time use';
foo = 'second time use';

범위와 관련하여 변수가 자동으로 전역 이되는 것은 사실 아닙니다 . 대신 Javascript는 범위 체인을 탐색하여 변수를 이전에 사용한 적이 있는지 확인합니다. 이전에 사용 된 것과 동일한 이름의 변수 인스턴스를 찾으면 해당 변수와 선언 된 범위를 사용합니다. 어디에서나 변수를 발견하지 못하면 결국 전역 객체 ( window브라우저에서)에 도달합니다. 변수를 첨부합니다.

var foo = "I'm global";
var bar = "So am I";

function () {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function () {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}

이 동작은 중첩 함수 및 콜백과 함께 사용할 때 실제로 강력합니다. functionsJavascript에서 범위가 무엇 이고 어떻게 작동 하는지 배우는 것이 가장 중요합니다.


아니, 그들은 동등하지 않습니다.

myObj = 1;당신 과 함께 글로벌 변수를 사용하고 있습니다.

후자의 선언은 사용중인 범위에 로컬 변수를 만듭니다.

차이점을 이해하려면 다음 코드를 시도하십시오.

external = 5;
function firsttry() {
  var external = 6;
  alert("first Try: " + external);
}

function secondtry() {
  external = 7;
  alert("second Try: " + external);
}

alert(external); // Prints 5
firsttry(); // Prints 6
alert(external); // Prints 5
secondtry(); // Prints 7
alert(external); // Prints 7

두 번째 함수는 전역 변수 "external"의 값을 변경하지만 첫 번째 함수는 변경하지 않습니다.


로컬 대 글로벌보다 조금 더 있습니다. 로 작성된 전역 변수 var는없이 작성된 전역 변수와 다릅니다. 이걸 고려하세요:

var foo = 1; // declared properly
bar = 2; // implied global
window.baz = 3; // global via window object

지금까지 답변을 바탕으로, 이러한 글로벌 변수 foo, barbaz모든 동등한입니다. 이다 없는 경우. 로 작성된 글로벌 변수 var에는 내부 [[DontDelete]]특성 이 (올바르게) 지정되어 삭제 될 수 없습니다.

delete foo; // false
delete bar; // true
delete baz; // true

foo; // 1
bar; // ReferenceError
baz; // ReferenceError

따라서 전역 변수에도 항상을 사용해야 var합니다.


이 주제에 대해 많은 혼란이 있으며 기존 답변 중 모든 것이 명확하고 직접적으로 모든 것을 다루지는 않습니다. 주석이 인라인 된 예제가 있습니다.

//this is a declaration
var foo;

//this is an assignment
bar = 3;

//this is a declaration and an assignment
var dual = 5;

선언은 DontDelete 플래그를 설정합니다. 과제는 그렇지 않습니다.

선언은 해당 변수를 현재 범위에 연결합니다.

할당되었지만 선언되지 않은 변수는 자체적으로 연결할 범위를 찾습니다. 즉, 동일한 이름의 변수가 발견 될 때까지 범위의 먹이 사슬을 가로지 릅니다. 아무것도 발견되지 않으면 최상위 범위 (일반적으로 전역이라고 함)에 연결됩니다.

function example(){
  //is a member of the scope defined by the function example
  var foo;

  //this function is also part of the scope of the function example
  var bar = function(){
     foo = 12; // traverses scope and assigns example.foo to 12
  }
}

function something_different(){
     foo = 15; // traverses scope and assigns global.foo to 15
}

무슨 일이 일어나고 있는지에 대한 명확한 설명을 위해 , 삭제 기능에 대한분석 은 변수 인스턴스화와 할당을 광범위하게 다루고 있습니다.


var선택 사항입니다. var로컬 범위에 변수를 넣습니다. 변수없이 정의 된 변수는 var전역 범위에 있으며 삭제할 수 없습니다 .

편집하다

특정 환경에서는 특정 시점에 삭제 불가능한 부분이 사실이라고 생각했습니다. 나는 그것을 꿈꿔 왔어 야했다.


그들은 동일하지 않습니다.

선언되지 않은 변수 (제외 var)는 전역 객체의 속성으로 처리됩니다. (일반적으로 블록 window에 있지 않은 한 객체 with)

로 선언 된 변수 var는 일반적인 지역 변수이며 선언 된 함수 외부에서는 볼 수 없습니다. (Javascript에는 블록 범위가 없습니다.)


이 바이올린을 확인하십시오 : http://jsfiddle.net/GWr6Z/2/

function doMe(){

a = "123"; // will be global
var b = "321"; // local to doMe
alert("a:"+a+"  --  b:"+b);

b = "something else"; // still local (not global)
alert("a:"+a+"  --  b:"+b);

};


doMe()
alert("a:"+a+"  --  b:"+b); // `b` will not be defined, check console.log

Javascript의 var 키워드는 목적을위한 것입니다.

var 키워드없이 변수를 선언하면 다음과 같습니다.

myVar = 100;

스크립트의 어느 부분에서나 액세스 할 수있는 전역 변수가됩니다. 의도적으로하지 않았거나 알지 못하는 경우 자바 스크립트의 다른 위치에서 변수 이름을 재사용하면 통증을 유발할 수 있습니다.

var 키워드로 변수를 선언하면 다음과 같습니다.

var myVar = 100;

범위에 국한됩니다 ({]-배치 위치에 따라 중괄호, 함수, 파일).

이것은 변수를 처리하는 더 안전한 방법입니다. 따라서 의도적으로 수행하지 않는 한 var 키워드를 사용하여 변수를 선언하십시오.


오늘 StackOverflow에서 묻는이 질문을 고려하십시오.

간단한 자바 스크립트 질문

좋은 테스트와 실용적인 예제 는 위 시나리오에서 발생하는 것입니다
. 개발자는 JavaScript 함수의 이름을 변수 중 하나에 사용했습니다.

코드에 어떤 문제가 있습니까?
코드는 사용자가 버튼을 처음 클릭 할 때만 작동합니다.

해결책은 무엇입니까? 변수 이름 앞에 키워드를
추가하십시오 var.


Var 은 프로그래머가 Javascript에 변수가 없기 때문에 변수를 선언하지 못하게합니다. 자바 스크립트에는 객체가 있습니다. Var 은 명시 적으로 정의되지 않은 객체에 이름을 선언합니다. 할당은 이름이 주어진 객체에 핸들로 이름을 할당합니다.

var를 사용 하면 Javacript 인터프리터에게 다음 두 가지를 알려줍니다.

  1. 사용하지 않을에 대표단 이 하나를 사용하는 대신, 이름에 대한 가치를 찾아 순회 역
  2. 이름 을 삭제하지 마십시오

var를 생략 하면 Javacript 인터프리터가 이름이 같은 오브젝트의 처음 발견 된 이전 인스턴스를 사용하도록 지시합니다.

키워드로서의 Var는 이름에 관한 Javascript가 잘못된 결정에서 나온 것과 같은 방식으로 언어 디자이너의 잘못된 결정에서 비롯되었습니다.

추신. 위의 코드 예제를 연구하십시오.


스코프에 관한 모든 것을 제쳐두고 다르게 사용할 수 있습니다.

console.out(var myObj=1);
//SyntaxError: Unexpected token var
console.out(myObj=1);
//1

무언가 대 진술


아니요, "필수"인 것은 아니지만 그렇지 않은 경우 중요한 문제를 일으킬 수 있습니다. var로 변수를 정의하지 않으면 해당 변수를 포함 된 코드 부분의 범위 안에 넣습니다. 그렇지 않은 경우 해당 범위에 포함되지 않으며 범위 외부에있는 동일한 이름으로 이전에 정의 된 변수를 덮어 쓸 수 있습니다. 당신이 속한 기능의.


방금 동료 중 한명이 추천 한 포럼에서 답을 찾았습니다. 함수 외부에서 변수를 선언하면 항상 전역 변수입니다. var 키워드를 사용하든 아니든 관계없이. 그러나 함수 내에서 변수를 선언하면 큰 차이가 있습니다. 함수 내에서 var 키워드를 사용하여 변수를 선언하면 지역 변수가되지만 var 키워드없이 변수를 선언하면 전역 변수가됩니다. 이전에 선언 된 변수를 덮어 쓸 수 있습니다. -http : //forum.webdeveloperszone.com/question/what-is-the-difference-between-using-var-keyword-or-not-using-var-during-variable-declaration/#sthash 에서 자세히 알아보십시오 . xNnLrwc3.dpuf

참고 URL : https://stackoverflow.com/questions/2485423/is-using-var-to-declare-variables-optional



반응형