0

1)我有一个事件驱动的内部函数。
2)内部函数依赖于外部函数中的变量。
3) 外部函数中的变量是外部函数的参数。
4) 外部函数正在运行多次。

q) 当内部函数稍后在代码中被触发时,我可以将外部函数中的参数变量排除在哪些值?

场景1)触发内部函数时,使用创建内部函数时存在的外部函数的确切状态。
场景2)触发内部函数时,使用外部函数的最新值。

例子:

function outerFunction(parameter) {
    var object = new Object();
    object.on('click', function () {
        alert(parameter);
    });
    return object;
}
4

3 回答 3

0

这取决于是什么parameter。在 javascript 中,字符串和数字是按值传递的,而对象是按引用传递的。因此,如果parameter是一个字符串,那么它将像 bfavaretto 所说的那样工作。但是,如果parameter是一个对象并且您在 上发出警报parameter.text,那么无论 的当前值是什么,您都会收到警报parameter.text

尝试在控制台中定义这些:

function outerFunction(parameter) {
    setTimeout(function () {
        console.log(parameter);
    },5000);
}

function otherOuterFunction(parameter) {
    setTimeout(function () {
        console.log(parameter.text);
    },5000);
}

现在,当您运行此行时,它将记录“测试”:

parameter = "text"; outerFunction(parameter); parameter = "hi";

但这将记录“hi”:

obj = {text: "text"}; otherOuterFunction(obj); obj.text = "hi";
于 2013-11-14T20:54:31.483 回答
0

对于 jQuery(可能还有类似的库),每次调用 on(evt, handler) 时,都会将新的处理程序绑定到该事件的元素。jQuery 堆栈处理程序。

所以如果你这样做:

outerFunction(1);
outerFunction(2);

jQuery 将绑定两个处理程序,当触发对象上的“单击”时,您将依次获得:

  1. “1”的警报。
  2. “2”的警报。

小提琴:http: //jsfiddle.net/ajWvk/

如果它是您的一些抽象事件绑定的实现,并且您的实现没有堆栈处理程序,那么您只需在每次调用 outerFunction 时绑定新的处理程序,擦除所有以前的处理程序。

在这种情况下,调用:

outerFunction(1);
outerFunction(2);

只会在对象上触发“点击”时提醒“2”。

于 2013-11-14T20:49:54.347 回答
0

每次outerFunction调用时,都会为 clicks 注册一个新的事件侦听器object。所以,如果你打电话:

outerFunction('foo');
outerFunction('bar');

您应该看到两个警报,一个针对'foo',一个针对'bar'

于 2013-11-14T20:43:19.217 回答