2010-04-21 3 views
7

ga이 선언되지 않으면 자바 스크립트 문이 오류를 일으킬 수 있습니다.왜 JavaScript 문 "ga = ga || []"Works?

if (ga) 
{ 
    alert(ga); 
} 

오류 : 그것은 선언되지 않은 변수가 부울 표현식에서 인식 할 수 보이는

ga is not defined 

. 그렇다면 왜 아래 진술이 효과가 있습니까?

나에게있어서, ga는 "||"앞에 bool 값으로 처리됩니다. false 인 경우, "||" 최종 GA에 배정됩니다.

+0

당신은'var ga = ga || [] 왜냐하면'ga = ga || [];'오류 (S.Mark가 지적한 것처럼). – R0MANARMY

+0

감사합니다. 질문을 업데이트했습니다. –

+3

나는 그것이 ga = ga ||라고 생각했다. 오. 라 = 라; want (yourBadRomance); –

답변

3

편집 : 먼저 var ga; 또는 var ga = ga || [];을 사용해야합니다. 먼저 선언하고 값을 할당해야합니다. Y는 X가 이미 선언하고 이미 1을 할당, 선언 할 때

당신은이

var x = 1, y = x + 1; 
alert([x,y]) // 1,2 

당신은 알 수 있습니다 시도 할 수 있습니다.

그래서, ga || [] 양수인이, 조지아 이미 선언 사건, 그 유효한 변수입니다.

+0

죄송합니다. "var"을 잊어 버렸습니다. 질문이 업데이트됩니다. –

+2

예, 왜냐하면'var'을 사용할 때 먼저 선언하고 할당은 나중에 발생하기 때문입니다. – YOU

+0

2 downvotes 점점 ..., 그래서 누군가가 내 대답은 잘못 지적 할 수 있을까요? 그래서 나는 그것을 고칠 수 있었다. – YOU

4

null 또는 자바 스크립트에서 정의 falsey 값 (암시 거짓으로 평가한다.)가있다 || 연산자는 false로 평가되지 않는 첫 번째 값을 반환합니다. & & 조작자가 제 falsey 값 또는 마지막 값을 반환 한편

var x = 0 || "" || null || "hello" || false; // x equals "hello" 

.

var y = "a string" && {"attr":"an object"} && false && ["array"]; 
// y equals false 

var z = "a string" && {"attr":"an object"} && ["array"]; 
// z equals ["array"] 
0

두 번째 문에서는 정의 된 경우 ga가 검사되고 true 인 경우 ga가 자체에 할당됩니다. 그렇지 않으면 빈 값이 할당됩니다.

1

이 범위 해상도 가변 정지가 생성되기 때문에 'VAR'의 경우에 작동합니다. 'var'가 없으면 스코프 체인을 들여다 보았고이라고 말합니다.

// This is fine because assignment always sets a property value 
// in this case (no 'var ga') it's the same as window.ga = window.ga || [] 
ga = window.ga || [] 

또는 :

// Once again, only the lookup is affected with "running off" 
// the lookup chain. It's not that the variable has no value -- 
// the problem is there IS NO VARIABLE. 
if (!window.ga) { 
    ga = [] 
} 

심지어이 : 두 경우 모두에 내가 명시 적으로 ga를 호출하는 것이

// First line is the same as window.ga = window.ga, 
// but now the property ga is guaranteed to exist on the window object -- 
// the VALUE of the property may (still) be undefined 
ga = window.ga 
ga = ga || [] 

주 당신이 정말로 원하는 경우는 전역 변수를 사용하는 window (전역) 개체의 속성

당신은 여기에 세부 사항에 대해 읽을 수 있습니다 Identifier Resolution, Execution Contexts and Scope Chains.

문제가되지 않는 범위 내에서 VAR의 배치.다음은 모두 동일합니다

var ga 
ga = ga || [] 

var ga = ga || [] 

ga = ga || [] 
var ga 
1

는 아마도 덜 이상한 보이는 옵션 :

if (typeof ga !== 'undefined') 
{ 
    alert(ga); 
} 
0

당신은 배열로 B를 기대하고, 아마 당신이 나에 배열 방법을 사용하려면 또는 인덱스 값을 읽습니다. 일치가 없었다 경우

var b= s.match(/\d+/) || []; 
return b[0]; 

이 빈 배열 assignmentment없이 일치하는 텍스트 또는

undefined-를 반환, 두 번째 줄에서 오류가 발생합니다.

관련 문제