1

나는이 식별자에 대해 배우고 있는데, 함수가 객체에서 호출되지 않을 때 비 엄격 모드에서 윈도우 객체를 참조한다는 것을 안다. 결과적으로 this.bar에 "무엇이든"을 기록 할 것으로 기대합니다.Chrome 콘솔과 결과가 다른 이유는 무엇입니까? This JS JS

Chrome 콘솔에서 코드를 실행할 때 "무엇이든지"출력이되지만 노드 빌드 시스템을 사용하여 코드를 실행할 때 출력이 정의되지 않습니다.

왜 그런 경우입니까? Chrome 콘솔의 결과가 정확한 것입니까? 다른 문제가 발생하면 언제쯤 이런 문제가 발생할 수 있습니까? 이 var bar = 'something' 같은 노드에서 변수를 선언 할 때

다음은이 글로벌 없습니다 선언 내 코드

function foo() { 
    // console.log(this) 
    console.log(this.bar); 
} 

var bar = "whatever"; 


// -------- 

foo();    // OUTPUT is "whatever" in the Chrome console and OUTPUT is undefined in Sublime's Node build system. 
+1

[이 "키워드는 어떻게 작동합니까?] (http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – Claies

답변

1

다른 컨텍스트를 지정하지 않고 기능에 this을 사용하면 전역 개체를 참조합니다. Chrome에서는 window 개체입니다. Node에서는 이것을 global이라고합니다. I 다른 컨텍스트를 지정 말할 때, 즉 특정 this 바인딩 생성자 또는 callapplynew 기능을 사용, 예를 들어, 일 것이다.

가장 큰 차이점은 노드에서 var bar = "whatever";을 사용하면 var을 사용하면 변수를 전체 노드 프로세스가 아니라 작성중인 모듈로 범위 지정하는 것입니다. Chrome에서는 전체 window 개체로 범위를 지정합니다. 모두 var을 제외하는 것과 같습니다.

범위에 관해서 몇 가지 예를 추가했습니다. 조금 더 명확하게하기 위해. 콘솔에서 놀아 보면 이런 것을 발견 할 수 있습니다.

예 1에서 볼 수 있듯이, test()를 호출하면 세계적 범위 x 변수를 생성했으며, this가 발견 Example 1window 변수를 참조한다.

예 2 :이 예에서 Example 2 , 우리는 새로운 영역을 생성하는 새로운 인스턴스를 생성. x 변수의 범위가 전역 적으로 지정되지 않습니다. 액세스하는 유일한 방법은 myInstance 컨텍스트를 사용하는 것입니다.문제에 관해서는

, 두 가지 옵션이 있습니다

옵션 1 (권장) : 줄이 세계적 범위되지 않기 때문에, 당신은 this

var bar = "whatever"; 

function foo() { 
    console.log(bar); 
} 
를 사용하여 전역 변수에 액세스하고 싶지 않아 이 글로벌 스코프에있을 변수를 설정합니다, 그래서 당신은 this 또는 global

0을 사용할 수 있습니다 :

옵션 2 (권장하지 않음)

global.bar = "whatever"; function foo() { console.log(this.bar); // console.log(global.bar); } 
0

하지만 모듈은 범위. 전역 변수를 선언하려면 global 개체를 사용해야합니다. 이런 식으로 뭔가 :

global.bar = 'something'; 
0

나는 100 % 확실하지 않다, 그러나 나는 창 개체를 함께 할 수있는 뭔가가 있으리라 믿고있어. 정의한 함수는 Global Window Object에 의해 소유됩니다. 어쩌면 노드 빌드 시스템에이 전역 객체가 없을 수도 있습니다.