2012-05-22 2 views
12

리터럴의 일부인 함수 내에서 객체 리터럴을 참조하는 것이 문제가됩니까? 잘 작동하는 것처럼 보이지만 다른 의미가 없는지 확인하고 싶습니다.Javascript : Object 'this'가 아닌 자체 키 함수의 리터럴 참조

대신 :

var obj = { 
    key1: "it", 
    key2: function(){return this.key1 + " works!"} 
}; 
alert(obj.key2()); 

사용 :

var obj = { 
    key1: "it", 
    key2: function(){return obj.key1 + " works!"} 
}; 
alert(obj.key2()); 

답변

16

두 가지 모두 문제가 될 수 있습니다. funcobj의 방법으로 호출되지 않습니다 때

var obj = { 
    key1: "it", 
    key2: function(){ return this.key1 + " works!" } 
}; 
var func = obj.key2; 
alert(func()); // error 

, this 다른 것을 참조 할 수 있습니다 (여기를 : 전역 객체 "window을"). 기능의 obj 지금 다른 객체를 가리킬 수 있지만

var obj = { 
    key1: "it", 
    key2: function(){ return obj.key1 + " works!" } 
}; 
var newref = obj; 
obj = { key1: "something else"; }; 
alert(newref.key2()); // "something else works" 

여기에서 우리는 다른 기준에서 개체에 액세스 할 수 있습니다.

그래서 어떤 경우가 더 좋을 지 선택해야합니다. 당신이 정말로 그것을 안전, 당신은 obj이 범위가 클로저를 사용할 수 있도록하려는 변경 될 수없는 경우

var obj = (function(){ 
    var local = { 
     key1: "it", 
     key2: function(){ return local.key1 + " works always!" } 
    }; 
    return local; 
})(); 

또는 당신에게 bind()하여 객체에 대한 기능 :

var obj = { 
    key1: "it", 
    key2: function(){ return this.key1 + " works always!" } 
} 
obj.key2 = obj.key2.bind(obj); 
0

내가 최고 떨어져 어떤 의미가 있다고 생각하지 않습니다 여기에

내가 무슨 말을하는지의 예 내 머리. 실수로 임의의 지점에서이 작업을 수행하지 않도록하십시오.

var obj = { 
    key1: "it", 
    key2: key1 + " works!" 
} 

오류가 발생할 수 있습니다. 그 이외에, 당신은 잘 가야한다!

1

가변 범위 바인딩에 차이가 있습니다. 원래 객체에 key2()을 (이 지금 newobj입니다)를 호출하는 경우에도 때문에,

var newobj = obj; 
obj = { key1: "new" }; 
alert(newobj.key2()); 

가 지금은 "새로운 작품을!"경고 : 나중에 OBJ를 수정하는 경우, 당신은 키 2의 반환 값을 수정합니다 obj.key1에 대한 참조가 이제 새 obj 인스턴스의 값에 바인딩됩니다. this을 사용하면 이러한 일이 발생하지 않습니다.

데모 : http://jsfiddle.net/m6CU3/

1

당신이 프로토 타입 객체를 사용하지 않는 경우, 당신이 그런 식으로 갈 CZN. 개체의 모든 인스턴스가 obj 인스턴스의 값을 반환하므로 ...

1

중 하나 또는 이러한 기술은 상황에 따라 적용될 수 있습니다.

함수 내에서 this의 값은 함수가 호출 된 방법에 따라 다릅니다.이 같은 객체의 속성으로 함수를 호출하는 경우 :

obj.key2(); 
//or 
obj["key2"](); 

다음 this 해당 개체가 될 것입니다. 객체가 객체 리터럴을 통해 생성되었는지 아니면 다른 방법을 통해 생성되었는지는 관련이 없습니다.

그러나 .call() 또는 .apply()을 사용하여 함수를 호출하고 다른 개체에 this을 명시 적으로 설정할 수 있습니다.

도 고려 : 나는 func()obj.key2과 같은 기능을 참조 할 func을 설정하지만, 전화 드렸습니다

var obj = { 
    key1: "it", 
    key2: function(){return this.key1 + " works!"} 
}; 
alert(obj.key2()); // alerts "it works!" 

var func = obj.key2; 
alert(func())​;  // alerts "undefined works!" 

objthis를 설정하지 않습니다.

자세한 내용은 what MDN has to say about this을 참조하십시오.