0

我怎样才能让这个函数通过引用这个代码来传递?

var Class = function() {
    var callback1;
    var callback2;

    function buildStuff(data, callback) {
        element.onclick = function() {
            doStuff(callback);
        };
    }

    function doStuff(callback) {
        callback();
    }

    return {
        "setCallback1":function(fn) {
            callback1 = fn;
        },
        "setCallback2":function(fn) {
            callback2 = fn;
        },
        //may rebuild with different data, but same callback
        "buildFoo":function(data) {
            buildStuff(data, callback1);
        },
        //may rebuild with different data, but same callback
        "buildBar":function(data) {
            buildStuff(data, callback2);
        }
    };
}

function main() {
    var object = Class();
    object.setCallback1(function() {
        //do stuff
    });
    object.setCallback2(function() {
        //do something else
    });
}

当您实际单击元素时,callbackundefined. 我希望它是我使用该setCallback函数设置的匿名函数,因为用户单击发生在我调用该setCallback函数之后。

谢谢!

编辑:感谢您的输入。我应该提到我需要能够动态设置callback等于。所以,我不能只callbackbuildStuff.

EDIT2:非常抱歉造成混乱;我意识到我的例子有点脱离背景,无法展示我在做什么。buildStuff实际上是一个被重复调用的私有成员函数(使用模块模式)。根据正在构建的内容,它需要不同的回调。回调实际上是在类之外设置的(嗯,模块模式类),所以它必须是动态的。我已经更新了我的代码,再次抱歉这个不好的例子。

4

2 回答 2

3

您在其中创建的单击处理程序buildStuff会在局部变量上创建一个闭包。你传递callback给你的buildStuff函数,但在你传递它的时候,它是undefined. 由于这会影响其他 callback变量,因此您始终会看到undefined,而不是其他 callback变量的状态。

相反,不要将参数传递给buildStuff,并且将创建闭包,并将捕获callback您想要的变量。

function buildStuff() {
    element.onclick = function() {
        doStuff(callback);
    };
}

想象一下;

  1. 您的全局变量callback 指向一个值(在这种情况下undefined)。

  2. 当您buildStuff进入时main(),您将回调()指向的值undefined作为参数传递给buildStuff

  3. 您的 click 处理程序在局部变量 + 范围内的其他变量上创建一个闭包(请注意,局部 callback 遮蔽了全局callback)。callback在您的事件处理程序中现在是undefined.

  4. setCallbacksetCallback使用运算符更改全局callback变量指向的值=。全局callback和局部callback现在指向不同的值,这就是您callback在事件处理程序更新中看不到的原因。

    在这种情况下,您要做的是更改 指向的值callback,因此指向那里的其他变量也会更新,但 JavaScript 不允许您这样做。

于 2013-05-01T21:13:05.410 回答
2

buildStuff是的,但你之前已经打过电话了setCallback

callback将使用当时(未定义)的内容。

如果您想buildStuff使用不同的回调调用,只需这样做,并消除多余的setCallback

function buildStuff(callback) {
    element.onclick = function() {
        doStuff(callback);
    };
}

function doStuff(callback) {
    callback();
}

function main() {
    buildStuff(  
      function() {
        //do something
      }
    );
}
于 2013-05-01T21:12:24.830 回答