programing

var 키워드의 목적과 사용(또는 생략)은 무엇입니까?

copyandpastes 2022. 10. 30. 21:04
반응형

var 키워드의 목적과 사용(또는 생략)은 무엇입니까?

메모: ECMAScript 버전 3 또는 5의 관점에서 질문한 것입니다.ECMAScript 6의 릴리스에 신기능이 도입되면, 그 해답은 시대에 뒤떨어질 수 있습니다.

의의 what the of of of의 입니까?var입니까?

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

그리고.

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

어느쪽인가를 언제, 그 이유와 용도에 따라 사용합니까?

글로벌 범위라면 큰 차이는 없습니다.Kangax의 답변을 읽고 설명

함수에 있는 경우 로컬 변수가 생성되고 "no var"는 변수를 찾거나 전역 스코프에 도달할 때까지(이 시점에서 변수가 생성됨) 스코프 체인을 검색합니다.

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

할는 '과제하다'를 요.var:

var x; // Declare x

차이가 있어요.

var x = 1 variabledeclarge를합니다. x현재 범위(실행 컨텍스트라고도 함)에 있습니다.선언이 함수에 나타나면 로컬 변수가 선언되고 전역 범위 내에 있으면 전역 변수가 선언됩니다.

x = 1반면, 이는 단순한 속성 할당입니다. 해결하려고 .x스코프 체인에 대응합니다.는 할당을 실시합니다.검출되지 않았을 경우x그런 다음 글로벌 객체(스코프 체인의 최상위 객체)에 속성을 만듭니다.

글로벌 변수를 선언하지 않고 글로벌 속성을 생성합니다.

변수 선언이 속성을 생성하는 것(변수 개체에만 해당)과 Javascript(ECMAScript)의 모든 속성(ReadOnly, DontEnum 및 DontDelete)이 특정 플래그를 갖는 것을 이해하지 않는 한 두 가지 차이는 미묘하며 혼동될 수 있습니다.

플래그를 하므로 DontDelete의 과 같습니다.var x = 1 ★★★★★★★★★★★★★★★★★」x = 1(글로벌 범위에서 실행되는 경우) 앞의 변수 선언은 DontDelete'able 속성을 생성하지만, 후자는 생성되지 않습니다.따라서 이 암묵적인 할당을 통해 생성된 속성은 글로벌 개체에서 삭제할 수 있으며, 이전 속성(변수 선언을 통해 생성된 속성)은 삭제할 수 없습니다.

그러나 이는 이론일 뿐 실제로는 구현 시 다양한 버그(IE의 버그 등)로 인해 두 가지 사이에 더 많은 차이가 있습니다.

모든 것이 이해되길 바랍니다. : )


[2010/12/16 갱신]

ES5(ECMAScript 5; 최근 표준화된 제5판 언어)에는 이른바 '엄격한 모드'가 있습니다.이것은 선언되지 않은 할당의 동작을 약간 변경하는 옵트인 언어 모드입니다.strict 모드에서는 미신고 식별자에 대한 할당은 ReferenceError입니다.그 이유는 의도하지 않은 할당을 포착하여 원치 않는 글로벌 자산의 생성을 방지하기 위함이었다.일부 최신 브라우저는 이미 엄격한 모드에 대한 롤링 지원을 시작했습니다.를 들어 호환성 표를 참조하십시오.

그것이 "지역글로벌"의 차이라고 말하는 것은 완전히 정확한 것은 아닙니다.

"로컬과 근접"의 차이점이라고 생각하는 것이 더 나을 수 있습니다.가장 가까운 곳은 분명 글로벌할 수 있지만, 항상 그런 것은 아닙니다.

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}

브라우저에서 Javascript가 실행되면 다음과 같이 모든 코드가 문이 있는 로 둘러싸여 있습니다.

with (window) {
    //Your code
}

상세정보 - MDN

★★varcurrent scope의 변수를 선언합니다.이것에 의해, 선언하는 것과 같은 차이는 없습니다.var 전혀 선언하지 않았습니다.

그 차이는 함수 내부나 블록 내부와 같이 직접 창 내부에 있지 않을 때 발생합니다.

「」를 사용합니다.var에서는 이름이 같은 외부 변수를 숨길 수 있습니다.이 방법으로 "개인" 변수를 시뮬레이션할 수 있지만, 이는 다른 주제입니다.

a a a험 a음음음음음음 a a a a a a a a a 。var그렇지 않으면 미묘한 버그가 발생할 위험이 있기 때문입니다.

편집: 받은 비판 후에 다음 사항을 강조하고 싶습니다.

  • var현재 범위의 변수를 선언합니다.
  • 는 " " " 입니다.window
  • 「」를 .var으로 선언하다var글벌표표 ( )
  • 를 사용하여 한다.var빼는 거랑 똑같아요.
  • var 변수를 선언하는 것과는 다릅니다.var
  • 선언하다var 좋은 이기 때문에

「」를 해 주세요.var변수를 선언하려면 키워드를 지정합니다.왜? 좋은 코딩 관행은 그 자체로 충분해야 하지만, 이를 생략하는 것은 이것이 글로벌 범위에서 선언된다는 것을 의미합니다(이와 같은 변수를 "임플리드" 글로벌이라고 합니다).Douglas Crockford는 암묵적인 글로벌을 사용하지 말 것을 권장합니다.또, Apple JavaScript Coding Guidelines에 의하면, 다음과 같습니다.

" " 를 하지 않고 var키워드는 글로벌스코프에서 작성되며 함수가 반환되었을 때(범위를 벗어나지 않기 때문에) 가비지가 수집되지 않기 때문에 메모리 누수가 발생할 가능성이 있습니다.

하지 않은 에서 지역변수를 선언하지 않은 하겠습니다.var:

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

)i.이는 루프가 로컬로 되지 않기 입니다.루프는 로컬로 선언되지 않기 때문입니다.for, global으로 무한 (infinite loop)가 .

대부분의 경우 사용하는 것이 좋다고 생각합니다.

로컬 변수는 항상 글로벌 범위의 변수보다 빠릅니다.

를 사용하여 변수를 선언하지 않으면 변수는 글로벌 범위 내에 있습니다.

자세한 내용은 Google에서 "Scope chain JavaScript"를 검색할 수 있습니다.

마세요var!

var변수를 선언하는 ES6 이전의 방식입니다.우리는 지금 미래에 있고, 당신은 그렇게 코딩해야 합니다.

const ★★★★★★★★★★★★★★★★★」let

const대95% 의95% 。않도록 때문에 노드의 될 수 .이러한 속성은, 「」, 「DOM」, 「DOM」, 「DOM」, 「DOM」, 「DOM」이 될 이 있습니다.const.

let재할당이 예상되는 모든 변수에 사용해야 합니다.을 뜻합니다.라도 약약면면면면면면면면면면면면라고 쓰면varName =, 「」를 사용합니다.let.

두 언어 모두 대부분의 다른 언어에서 예상하는 블록 수준의 범위를 가집니다.

다른 차이점, 예:

var a = a || [] ; // works 

하는 동안에

a = a || [] ; // a is undefined error.

「」를 사용합니다.var는 변수가 글로벌스코프와 변수 간에 경합하여 불필요한 덮어쓰기가 발생하는 것을 방지하기 위해 항상 권장되는 방법입니다.

var variable - 글로벌 변수. - 글로벌 변수.

항상 사용할 을 강력히 권장합니다.var스테이트먼트는 로컬콘텍스트의 init 글로벌 변수가 악성이기 때문입니다. 이 속임수가

/* global: varname1, varname2... */

이 개념을 이해하기 위해 작성한 코드 예를 다음에 나타냅니다.

var foo = 5; 
bar = 2;     
fooba = 3;

// Execute an anonymous function
(function() {    
    bar = 100;             //overwrites global scope bar
    var foo = 4;           //a new foo variable is created in this' function's scope
    var fooba = 900;       //same as above
    document.write(foo);   //prints 4
    document.write(bar);   //prints 100
    document.write(fooba); //prints 900
})();

document.write('<br/>');
document.write('<br/>');
document.write(foo);       //prints 5
document.write(bar);       //prints 100
document.write(fooba);     //prints 3

@는 @Chris S의 예를 var 된다var여기 또 있습니다. 특히 위험한 것은 그 차이가 비동기 환경에서만 볼 수 있기 때문에 테스트 중에 쉽게 스쳐 지나갈 수 있기 때문입니다.

할 수 인 출력입니다.["text"]:

function var_fun() {
  let array = []
  array.push('text')
  return array
}

console.log(var_fun())

입니다.let 전에array

function var_fun() {
  array = []
  array.push('text')
  return array
}

console.log(var_fun())

데이터 조작을 비동기적으로 실행해도 단일 실행자와 동일한 결과를 얻을 수 있습니다.

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

var_fun().then(result => {console.log(result)})

그러나 여러 개일 경우 동작이 다릅니다.

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

단, let 사용:

function var_fun() {
  let array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

이것을 배우려는 사람으로서 나는 이렇게 본다.위의 예들은 초보자들에게는 다소 복잡할 수 있다.

이 코드를 실행하는 경우:

var local = true;
var global = true;


function test(){
  var local = false;
  var global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

출력은 false, false, true, true로 표시됩니다.

함수 내의 변수가 외부 변수와 분리되어 있기 때문에 로컬 변수라는 용어는 할당에서 var를 사용했기 때문입니다.함수의 var를 삭제하면 다음과 같이 표시됩니다.

var local = true;
var global = true;


function test(){
  local = false;
  global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

출력은 false, false, false, false입니다.

이는 로컬 범위 또는 함수에 새 변수를 만드는 대신 글로벌 변수를 사용하여 false로 재할당하기 때문입니다.

변수 유무와 함수 내외부의 변수를 선언할 때 사람들이 혼란스러워 하는 것을 알 수 있습니다.다음은 다음 단계를 안내하는 심층적인 예입니다.

여기 jsfiddle에서 아래 스크립트를 참조하십시오.

a = 1;// Defined outside the function without var
var b = 1;// Defined outside the function with var
alert("Starting outside of all functions... \n \n a, b defined but c, d not defined yet: \n a:" + a + "\n b:" + b + "\n \n (If I try to show the value of the undefined c or d, console.log would throw 'Uncaught ReferenceError: c is not defined' error and script would stop running!)");

function testVar1(){
    c = 1;// Defined inside the function without var
    var d = 1;// Defined inside the function with var
    alert("Now inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};


testVar1();
alert("Run the 1. function again...");
testVar1();

function testVar2(){
    var d = 1;// Defined inside the function with var
    alert("Now inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};

testVar2();

alert("Now outside of all functions... \n \n Final Values: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n You will not be able to see d here because then the value is requested, console.log would throw error 'Uncaught ReferenceError: d is not defined' and script would stop. \n ");
alert("**************\n Conclusion \n ************** \n \n 1. No matter declared with or without var (like a, b) if they get their value outside the function, they will preserve their value and also any other values that are added inside various functions through the script are preserved.\n 2. If the variable is declared without var inside a function (like c), it will act like the previous rule, it will preserve its value across all functions from now on. Either it got its first value in function testVar1() it still preserves the value and get additional value in function testVar2() \n 3. If the variable is declared with var inside a function only (like d in testVar1 or testVar2) it will will be undefined whenever the function ends. So it will be temporary variable in a function.");
alert("Now check console.log for the error when value d is requested next:");
alert(d);

결론

  1. var(a, b 등)가 있든 없든 간에 함수 외부에서 값을 얻으면 값이 유지되며 스크립트를 통해 다양한 함수 내에 추가된 다른 값도 유지됩니다.
  2. 변수가 함수 내에서 var 없이 선언되면(예를 들어 c), 이전 규칙과 동일하게 동작하며 이후 모든 함수에서 값을 유지합니다.함수 testVar1()에서 첫 번째 값을 얻었거나 값을 유지하고 함수 testVar2()에서 추가 값을 얻습니다.
  3. 변수가 함수 내에서만 var로 선언된 경우(testVar1 또는 testVar2의 d와 같이) 함수가 종료될 때마다 정의되지 않습니다.따라서 함수의 임시 변수가 됩니다.

var를 사용하지 않고 변수를 사용하면 var_name이 자동으로 글로벌스코프에 배치됩니다.예를 들어 다음과 같습니다.

someFunction() {
    var a = some_value; /*a has local scope and it cannot be accessed when this
    function is not active*/
    b = a; /*here it places "var b" at top of script i.e. gives b global scope or
    uses already defined global variable b */
}

범위 문제 외에도, 어떤 사람들은 들어올리는 것을 언급하지만, 아무도 예를 들어주지 않았다.다음은 글로벌 범위입니다.

console.log(noErrorCase);
var noErrorCase = "you will reach that point";

console.log(runTimeError);
runTimeError = "you won't reach that point";

var를 사용하지 않으면 값을 설정할 때만 변수를 정의할 수 있습니다.예:

my_var;

글로벌 범위 또는 기타 범위에서는 사용할 수 없습니다.다음과 같은 가치가 있어야 합니다.

my_var = "value";

한편, 다음과 같은 바이러블을 정의할 수 있습니다.

var my_var;

은 「 」입니다.undefined).null은 리고고그 to to to to to to to to to to to to와 같지 않습니다.null★★★★★★★★★★★★★★★★」

브라우저의 window 객체에 변수를 부가하는 경우를 제외하고 var 키워드를 사용해야 합니다.다음 링크에서는 및 wihtout var 키워드를 사용하여 global scoping과 로컬 scoping의 차이 및 범위를 설명합니다.

var 키워드를 사용하지 않고 변수를 정의하면 단순한 "할당" 작업이 됩니다.

javascript에서.javascript와 .가 「」를 실행하고 있는 .dummyVariable = 20 변수 선언이 hoosting(호이스트라고 불리기 에) (javascript interpreter는 javascript interpreter를 사용합니다).

javascript에서의 hoosting도 참조할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1470488/what-is-the-purpose-of-the-var-keyword-and-when-should-i-use-it-or-omit-it

반응형