2012-10-06 5 views
0

가능한가요? 그렇다면 어떻게 될까요?자체 생성 기능?

원래 기능

호출 foo는()

새로운 기능

:

var foo = function() 
{ 
    console.log("Original Function"); 
    this = function() 
    { 
     console.log("New Function"); 
    } 
}; 
console.log("Calling foo()"); 
foo(); 

원하는 출력 (작동하는 나는 방법을 찾을 수가 없었다)

사전에 질문에 답변하려면 예. 이것을하는 방법. 나는 단지 var bar = new foo();과 같은 것을 할 수 있고 여분의 기능없이 시간에 의존하는 속성을 foo() 할당하면 궁금합니다.

편집 : Charmanders의 질문에 응답하고, 약간 덜 단순화, 더 실용적인 응용 프로그램

var node = function(parent) 
{ 
    this = function() 
    { 
     for (i in this) 
     { 
      // perform actions (which will occasionally include calling i() 
     } 
    } 
    if (parent !== null) 
    { 
     this.parent = parent; 
     // code to determine children 
     this.somechild = new node(this); 
     this.someotherchild = new node(this); 
    } 
}; 
var ancestor = new node(new node(null)); 
+3

귀하의 사례는 귀하의 질문과 매우 관련이있는 것으로 보입니다. 성취하고자하는 바를 정확히 기재하십시오. 이유는 무엇입니까? –

답변

2

,하지만 당신은 단순히 함수 반환 할 수 있습니다

var foo = function() { 
    console.log("Original Function"); 
    return function() { 
     console.log("New Function"); 
    }; 
}; 

console.log("Calling foo()"); 
var f = foo(); /* or even: f = new foo(); */ 
f(); 
0

네,하지만 당신은 this에 할당을하지 않는다 :

function foo() { 
    console.log("original"); 
    foo = function() { 
    console.log("new"); 
    }; 
} 

을 모든 일은 글로벌 심볼 "foo"에 새로운 값을 할당하여 새로운 값이 함수가되도록합니다.

따라서 foo()을 두 번 호출하면 처음에는 "원본"으로 인쇄되고 그 후에는 항상 "신규"로 인쇄됩니다.

this의 값은 일반적으로 참조되는 함수의 값이 아닙니다. 그것 수 있습니다하지만, 당신은 일종의 다소 비정상적인 상황을 설정해야 겠어. 이 경우에도 this에 새 값을 할당 할 수 없습니다. 함수의 여러 개의 독립적 인 복사본이 존재 할 수 있도록 기능이 저장된 위치를 알 안 경우

var foo = function() 
{ 
    console.log("Original Function"); 
    foo = function() 
    { 
     console.log("New Function"); 
    }; 
}; 

:이 기술을 사용하려면

+0

원래 기능을 손상시킬 수있는 것처럼 보입니다 (문제 일 수도 있고 아닐 수도 있음)? –

+4

@MattWhipple 나는 원래의 기능을 clobbering하는 것은 OP가 의도하는 것과 정확히 같다. 나는 틀릴 수도 있지만 원하는 효과를 내기 위해 일어날 수있는 다른 일을 상상할 수는 없습니다. – Pointy

2

, 직접 외부 함수를 변수에 할당해야 , 당신은 정말 폐쇄 공장 사용하려면 : this에 새로운 값이 작동하지 않습니다 할당

function makeReplacingFunction() { 
    var fn; 

    fn = function() { 
     console.log("Original Function"); 
     fn = function() { 
      console.log("New Function"); 
     }; 
    }; 

    return function() { fn(); } 
} 

var foo = makeReplacingFunction(); 
foo(); 
foo();