2012-11-22 3 views
2

중복 될 수는 있지만 검색 방법을 알지 못했습니다.기존 객체 또는 빈 객체 할당

var test = test || {}; 

작동하지만

var test = testing || {}; 

에서 오류가 발생합니까? 정의 시점에서 testtesting은 정의되지 않습니다.

편집

발생 된 오류는 다음과 같습니다 인해 var 키워드

+0

@MattLin :하지만이 중'test'을 정의하거나 I를하지 않았다? – Amberlamps

+0

+1 좋은 질문입니다. – paragy

+0

@nozzleman : 뭐라고 요? 단지'var test = testing || {};을 (를) 콘솔에 연결하십시오. – Amberlamps

답변

3

기존 변수가 정의되지 않은 변수와 값이 undefined 인 변수 사이에는 차이가 있습니다. 첫 번째 예에서

당신은 =의 오른쪽에 표현식이 평가 될 때 변수 test이 존재하지만 값 undefined을 가지고 var 등으로 test을 선언합니다.

두 번째 예에서는 testing을 전혀 정의하지 않았으므로 오류가 발생합니다.

편집 : 나에게 추가적인 설명이 아프지 않을 것입니다.

간단히 말하면 JavaScript 엔진은 코드를 두 번 통과합니다. 첫 번째 단계는 구문 분석/컴파일 단계이며 변수 선언은 이지만 할당은이 아닙니다. 두 번째 패스는 실제 실행이며 할당이 발생합니다. 이로 인해 종종 "가변 호이 스팅"이라고하는 효과가 발생합니다. JS 엔진이 선언문을 해당 범위의 맨 위에 "올려 놓지 만"여전히 할당을 수행합니다.

그래서 같은 코드의 포인트로 :

var test = test || {}; 

... 그것은 기본적 말하는 "test 아직 그것을 사용하는 경우 그렇지 않으면 truthy 값으로 존재하는 새로운 빈으로 설정 하는가 목적." 같은 변수가 동일한 범위에 두 번 이상 선언 된 경우

JS 엔진은 상관하지 않습니다 - 그것은 기본적으로 두 번째 선언,을 무시하지만 두 번째 선언에 포함 된 모든 할당을 무시하지 않습니다. 따라서 test이 다른 스크립트 블록에서 선언 된 경우, 별도의 JS 포함 파일에있는 경우 해당 행은 test을 자체에 할당합니다 (모든 객체가 진실 인 진실 값이 있다고 가정).그러나 다른 곳에서 선언되지 않은 경우 현재 var 문으로 인해 여전히 존재하지만 현재 할당 전에 undefined이되므로 || 연산자가 오른쪽 피연산자 인 {}을 반환합니다. 여기

+1

'존재하지 않는 것으로 정의되지 않은 변수와 정의되지 않은 값을 갖는 변수 사이에는 차이가있다 .' . 이것은 라인입니다. +1 – Jashwant

+0

관련 답변 bro..thanks – Akhil

1

그건 "을 참조 오류 테스트는 정의되어 있지 않습니다." 변수가 선언 되었기 때문에 값이 정의되지 않았더라도 변수가 존재합니다. 그러면 ||이하는 일은 진리를 확인하는 것이며, 객체가 정의되지 않았다고 판단되면 작업 할 새 객체를 제공합니다.

후자는 완전히 동일하지만 "한 줄"에서 수행하고 있으므로 testing 개체는 평가할 때 정의되지 않으므로 예외가 throw됩니다.

1
var test = test || {}; 

, test

var test = testing || {}; 

무엇이든지 testing의 대한 언급도 없다 당신은 여전히 ​​값을 할당하려고, declared하지만 defined

만에를하고있다.

될 첫 번째 경우에 대한 해당 코드

,

var testing; // See testing is still undefined 
var test = testing || {};