2013-07-09 5 views
2

다음 코드의 결합 범위가 자바 스크립트 중첩 된 함수 ...

window.name = "window"; 

object = { 
     name: "object", 
     method: function() { 
      nestedMethod: function() { 
        console.log(this.name); 
      } 
      nestedMethod(); 
     } 
} 

object.method(); // print 'window' 

내가 내 질문에 this에 대한 자세한 내용을 사람 생각하세요 설명합니다 수있는 범위를 잃는? 우리가 만든 익명의 모든 함수가 전역 범위에 적용될 것인가?

+0

당신은 개체의 이름을 사용하여 시도 할 수 object.name''있도록 : 당신이 전화를 작동하기위한 수동으로 컨텍스트를 정의 할 call (또는 apply)를 사용할 수 있습니다. – elclanrs

+1

no. 모든 함수는 속성으로 객체에 바인딩되지 않는 한 기본적으로 전역 범위로 이동합니다 ... – dandavis

+2

@dandavis는 정말 정확하지 않습니다. 함수는 본질적으로 모든 범위를 ""수행하지 않습니다. 'this'의 값은 함수를 호출 할 때마다 상황에 따라 결정됩니다. – Pointy

답변

1
window.name = "window"; 

object = { 
    name: "object", 
    method: function() { 
     var self = this; 
     var nestedMethod = function() { 
      console.log(self.name); // or object.name without declaring self 
     } 
     nestedMethod(); 
    } 
} 

object.method(); // print 'object' 

저장 개체의 범위 - 또는 객체 자체를 사용!

우리가 만든 익명의 모든 기능은 전역 범위에 적용됩니까?

아니, 모든 익명 함수, 그들은 특정 this 호출하지 않으면 스코프 (전역 객체에 바인딩 모든 기능이 applycall은, 아래의 예를 참조 참조 그들의 범위를 잃을하지)! 이런 식으로 호출 것

window.name = "window"; 

object = { 
    name: "object", 
    method: function() { 
     var nestedMethod = function() { 
      console.log(this.name); 
     } 
     nestedMethod.call(this); //change the this arg in the current object scope 
     // when you call this function with .call(this) you are changing the value of the nestedMethod's this to the current this, which is object 
    } 
} 

object.method(); // print 'object' 
+1

모든 기능의 범위가 전역 개체로 지정된다는 것은 무엇을 의미합니까? 전역 범위에서 nestedMethod를 직접 호출 할 수 있다고 말하고 있습니까? – peter

+0

FYI, this는 * scope *가 부정확하다는 것을 말하는 것입니다 (적어도 당신이 그렇게하고있는 것처럼 보입니다). –

+0

_ "모든 기능의 범위는 전역 개체입니다"_ _ 저는 이것이 약간 부정확하다고 생각합니다. 'this'가 바인드되지 않은 함수는 윈도우 컨텍스트에서 실행되지만 범위는 여전히 가장 가까운 함수입니다. – elclanrs

2

모든 기능 :

someFunction(); 

이 (비 엄격 모드에서) this의 값으로 전역 범위를해야합니다. 당신은 로컬 변수에 외부 범위를 숨기고, 또는 다른 사용할 수 있습니다 .call() 또는 .apply() :

단순히 전역 객체를 가리 킵니다 함수 내에서 func(), this를 작성하여, 함수를 호출 할 때마다
nestedMethod.call(this); 
+0

당신은 그것이 호출되는 범위와 정의되는 위치에 관계없이? – peter

+0

@ user1389813 네, 맞습니다. 'new'가 아닌'.call()'이나'.apply()'가 아닌'foo.myFunc()'와 같은 객체 속성 참조를 통해 호출되는 함수는 모두 'this'는 비 엄격 모드의'window' (전역) 객체이고 엄격 모드의'undefined'입니다. – Pointy

3

. 귀하의 경우에 당신은 쓰기 :

nestedMethod(); 

그래서 nestedMethod 내부 this 창 개체입니다.

nestedMethod.call(this); 
관련 문제