2010-12-01 3 views
4

자바 스크립트 프로그램을 작성하고 Chrome 7에서 실행 중입니다. 일부 이상한 동작이 발생했습니다. 자, 코드 내에서, 다른 모든 것들이 계속 진행되면서, 그것이 나라는 것을 알기까지 어느 정도 시간이 걸렸습니다.변수가 변경되기 전에이 Chrome V8 동작을 설명 할 수 있습니까?

나는 아래 코드의 핵심을 증류했습니다.

Printing before: 
[1000, 2000, 3000, 4000, 5000] 
------------------------ 
Printing after: 
[1000, 2000, 3000, 4000, 5000] 

방법은 첫 번째 통화는 data_copy의 변경된 버전 인쇄 CONSOLE.LOG에 와서 :이 크롬 7에서 실행하면

<html> 

<script> 

var data = [1,2,3,4,5]; 

var data_copy = []; 

for (var i=0; i<data.length; i++){ 
    data_copy.push(data[i]); 
} 

console.log("Printing before:"); 
console.log(data_copy); 

//alert(data_copy); 

console.log("------------------------"); 

for (var i=0; i<data_copy.length; i++){ 
    data_copy[i] = data_copy[i] * 1000; 
} 

console.log("Printing after:"); 
console.log(data_copy); 

</script> 

</html> 

, 나는 자바 스크립트 콘솔에서 다음과 출력을 얻을? 나는 또한 Node.js를의 코드를 시도

Printing before: 
[1, 2, 3, 4, 5] 
------------------------ 
Printing after: 
[1000, 2000, 3000, 4000, 5000] 

나는 정상 (두 번째 얻을 : 나는 "경고"의 주석과 같은 코드를 실행하면

지금, 나는 당신이 일반적으로 기대하는 것을 얻을) 출력.

아이디어가 있으십니까?

일부 JIT 최적화가 잘못 되었습니까?

아니면 확실하지 않은 것이 있습니까?

+0

브라우저가 변경된 후에 비동기 적으로 호출하도록 호출하는 것 같습니다. 그런데 왜 그렇게할까요? – Hejazzman

답변

4

변경 console.log(data_copy)에서 console.log(String(data_copy))으로 변경하십시오.

console.log은 효과적으로 Chrome 콘솔을 참조하여 개체를 보냅니다. alert은 스크립트를 인터럽트하여 나중에 기록되기 전에 처음 기록 된 data_copy이 렌더링됩니다. 그렇지 않으면 콘솔이 data_copy 참조를 렌더링하기 전에 전체 스크립트가 완료까지 실행됩니다.

+0

console.log 호출을 참조로 볼 수는 있지만 왜 즉시 렌더링되지 않습니까? – Hejazzman

+0

그리고 node.js (본질적으로 V8)가 같은 (잘못된) 출력을주는 이유는 무엇입니까? – Hejazzman

+0

@foljs : 콘솔은 V8의 일부가 아니며 Chrome의 일부입니다. 그리고 브라우저의 JS 스레드는 반드시 단일 스레드이므로 Chrome 사용자는 JS 스레드가 JS 객체를 렌더링하는 방법을 알아내는 것보다 객체를 대기열에 넣고 다음에 JS 스레드가 사용 가능할 때까지 기다리는 것이 더 간편하다고 결정했습니다. 임의의 맥락에서. – ephemient

1

참조 crbug.com/44720

관련 문제