2013-04-22 3 views
1

이 문제를 자주 접했고 결국 설명을 요청할 것이라고 생각했습니다. Chrome을 사용하고 자바 스크립트 콘솔을 자주 사용합니다. 전역 변수를 선언 할 때 항상 콘솔에서 해당 내용에 액세스 할 수 있지만 브라우저에서 스크립트가 실행될 때 함수 내부에서 변수에 액세스하려고하면 "정의되지 않은 최상위 '속성을 읽을 수 없습니다"오류가 발생합니다 .자바 스크립트 전역 범위 오역

여기에 코드 조각을 붙여 넣을 것입니다. 누군가 내가 왜이 오류가 발생하는지 설명 할 수 있다면 대단히 감사하겠습니다.

// JavaScript Document 
var myglobalvariable; 
// ... 

$(document).ready(function() { 
    myglobalvariable = document.getElementsByTagName("article"); 
    // ... 
}); 

function myFunction() { 
    for (i in myglobalvariable) { 
    mylocalvariable_top = myglobalvariable[i].style.top; // Error points to this line 
    // ... 
    } 
} 

myFunction은 일반적으로 이벤트 처리기에 의해 호출되어 위에서 언급 한 오류를보고합니다.

+1

for는 객체가 아니라 배열과 함께 사용해야합니다. –

+0

off 주제 : 모든 jQuery 헬퍼를 사용할 수 있지만 아직 사용하지 않으십니까? –

+0

@ DanLee 스크립트에서 jQuery 도우미가 있었지만 실행중인 꽤 성능이 좋은 프로세스였습니다. jQuery 헬퍼에 대한 성능을 살펴 보았습니다. 일부 개발자는 jQuery 선택기를 처리하는 데 시간이 오래 걸린다 고 말했습니다. 그래서 나는 스크립트를 빨리 실행하려고 노력했다. 성능에 대해 자세히 알아 보려면 부분적으로이 방법을 사용하십시오. – Theunis

답변

1

가장 잘 배열에 대한 for ... in을 피하기 위해.즉, 당신이 작성해야 바로이 오류를 생산하고 오해를 명확히했다 :

입니다
function myFunction() { 
    for (i in myglobalvariable) { 
    mylocalvariable_top = i.style.top; // <-- i IS the element 
             // <-- for clarity you should probably rename "i" to 
             // "element" or something more descriptive which will 
             //  make clear it is not a numerical index 
    // ... 
    } 
} 

, 그것은 i 이미 "는 I-을 의미 귀하의 경우 이후 조회 myglobalvariable[i]을 할 수 이해가되지 않습니다 배열의 번째 요소 myglobalvariable "

일반적인 for 루프의 규칙과 for... in 구문의 규칙을 간단히 섞어서 사용하고 있습니다.

+0

명확히하기 위해 요나 감사합니다. 지금 오류를 이해하십시오. – Theunis

0

나는 당신이하는 일이 당신이 원하는 바가 아니라고 생각합니다.

이것은 배열의 항목을 반복하지 않고 객체의 키/속성 이름을 반복합니다.

myglobalvariable[i] 

위의 키를 사용하여 속성을 입력하면 액세스 할 수 있습니다.

myglobalvariable[i].style.top 

상기의 스타일 속성에 액세스하십시오. 해당 객체에 스타일 속성이 없으면이 객체는 정의되지 않습니다. 즉, 존재하지 않는 속성에서 .top을 호출하면 "정의되지 않은 속성 '을 읽을 수 없습니다."라는 의미입니다.

여기서 제시하는 것은 특정 문제이며 일반적인 "글로벌 범위 오해"는 아닙니다.

솔루션

var i, len = myglobalvariable.length; 
for (i = 0; i < len; i++) { 
    if (myglobalvariable[i].style) 
     mylocalvariable_top = myglobalvariable[i].style.top; 
    // ... 
} 
0

이 노드의 NodeList을 만듭니다.

$(document).ready(function() { 
    myglobalvariable = document.getElementsByTagName("article"); 
    // ... 
}); 

각 노드 NodeList 개체에 대한 추가 속성을 통해이 반복합니다. 당신은 노드 수 없습니다와 style 속성이없는 myglobalvariable에서 항목을 발생할 수 있다고 말했다

function myFunction() { 
    for (i in myglobalvariable) { 
    mylocalvariable_top = myglobalvariable[i].style.top; // Error points to this line 
    // ... 
    } 
} 

. 특히, i은 반복 중에 어느 시점에서 itemlength이됩니다.

이보다 안전하게 목록을 반복합니다 : 다른 사람이 말했듯이

function myFunction() { 
    for (var i = 0; i < myglobalvariable.length; i++) { 
    mylocalvariable_top = myglobalvariable[i].style.top; // Error points to this line 
    // ... 
    } 
} 
+1

'getElementsByTagName'은'NodeList'를 리턴합니다. 여러면에서'Array'와 유사하지만, 하나가 아닙니다. – Quentin

+0

@Quentin Corrected. – svidgen

+0

위의 for 루프는 문제를 해결했습니다. 고마워요 svidgen :) – Theunis