自我生成功能?

时间:2012-10-06 19:43:31

标签: javascript

这是可能的,如果是这样的话怎么样? (我一直无法找到工作方式)

var foo = function() 
{ 
    console.log("Original Function");
    this = function() 
    {
        console.log("New Function");
    }
};
console.log("Calling foo()");
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 个答案:

答案 0 :(得分:2)

如果要使用此技术,则需要直接分配外部函数变量:

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

如果函数不知道它存储的位置,以便可以存在多个独立的函数副本,那么你真的想要使用一个闭包工厂:

function makeReplacingFunction() {
    var fn;

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

    return function() { fn(); }
}

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

答案 1 :(得分:2)

this分配新值不起作用,但您只需返回一个函数:

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();

答案 2 :(得分:0)

是的,但是你没有通过分配到this

来做到这一点
function foo() {
  console.log("original");
  foo = function() {
    console.log("new");
  };
}

所有这一切都是为全局符号“foo”分配一个新值,以便新值恰好是一个函数。

因此,当您拨打foo()两次时,它会在第一次打印“原始”,之后每次打印“新”。

this的值通常不是引用它的函数的值; 可以,但你必须设置一个有点不寻常的情况。即使它是,您也无法为this分配新值。