【问题标题】:Javascript - Replace callback with function, including parametersJavascript - 用函数替换回调,包括参数
【发布时间】:2015-02-18 19:06:18
【问题描述】:

虽然 Stackexchange Meta 禁止我以“嗨”开头,但我认为友好并没有实质性的危害。

嗨,

我使用下面这段代码,

while (!success) {
    new Magister(chosenSchool, username, password).ready(function(error){
        /* Code here using the error variable above */
    });
}

但是 JSLint 警告我,在循环中定义函数是一种不好的做法。
但是,使用以下代码也不起作用。

function checkLogin(error) {
    /* Code here using the error variable above */
}
while (!success) {
    new Magister(chosenSchool, username, password).ready(checkLogin(error));
}

这导致Uncaught ReferenceError: error is not defined。我怎样才能不重新定义函数,但仍像原来的 function(error){...} 一样传递 error
我尝试了各种方法,但对我来说都不会让步。

提前致谢!

【问题讨论】:

  • while (!success) 听起来是个非常糟糕的主意。
  • @Bergi 哦,我认为我不会真正使用它,我只会发出一次警告并取消操作并等待用户开始的新呼叫.. 但是,我仍然'想知道我的问题的答案:]

标签: javascript function parameters parameter-passing referenceerror


【解决方案1】:

只是不要调用函数:

new Magister(chosenSchool, username, password).ready(checkLogin);

ready 需要一个函数对象,因此您必须传递 chechLogin 本身,而不是调用它并传递其返回值(可能是 undefined)。

我怎样才能不重新定义函数,但仍像原来的function(error){...} 一样传递error

也许这就是混乱所在。你实际上根本没有通过error。参数由调用者传递,即ready


JavaScript 的一个不错的特性是,您可以简单地将变量替换为其值的文字表示形式(在大多数情况下)。

如果我们看一下

new Magister(...).ready(checkLogin(error));

并将checkLogin 替换为它的值(函数)

new Magister(...).ready(function checkLogin(error){...}(error));

但是,这根本不像第一个版本!突然,一个狂野的(error) 出现在我们函数定义的末尾。

让我们反过来:

new Magister(...).ready(function(error){...});
// becomes
new Magister(...).ready(function checkError(error){...});
// becomes
function checkError(error) { ... }
new Magister(...).ready(checkError);

好多了。

【讨论】:

  • 好的,我明白了!所以checkLogin(error) 实际上会执行该函数并将其值返回给调用它的任何对象,而checkLogin 指的是该函数,由调用它的任何对象提供参数?
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2012-12-10
  • 2015-05-22
  • 2015-12-24
相关资源
最近更新 更多