首页 > 解决方案 > Javascript:TypeError:回调不是函数

问题描述

在这里拉我的头发,试图理解 Javascript 令人恼火的细微差别。希望一些 JS 大师可以看一看,指点然后走,“嗯,你的问题……”。

这是问题的精简示例:

var Parent = (function () {
    var func1 = function () {
        func2(function (res) {
            console.log(res);
        });
    };

    var func2 = function (callback) {
        callback('abc');
    };

    return {
        init: function () {
            func1();
            func2();
        }
    };
})();

打电话给Parent.init();

这失败并出现错误:

Uncaught TypeError: callback is not a function
    at check2 (<anonymous>:9:9)
    at Object.init (<anonymous>:15:13)
    at <anonymous>:1:8

让我感到惊讶的是,如果我像这样注释掉封闭代码,那么它会按预期工作:

// var Parent = (function () {
    var func1 = function () {
        func2(function (res) {
            console.log(res);
        });
    };

    var func2 = function (callback) {
        callback('abc');
    };

    // return {
    //     init: function () {
    //         func1();
    //         func2();
    //     }
    // };
// })();

...并打电话给func1();

结果:

abc

我错过了什么?

谢谢

标签: javascript

解决方案


在您的版本中,您在调用func2()时未指定callback函数,这是必需的参数。在您的第二个示例(init已注释掉)中,您正确地指定callbackfunc2(function (res) { ... });.

下面的代码片段是您正在寻找的东西吗?

const Parent = (function () {
  const func1 = function () {
    func2(function (res) {
      console.log(res);
    });
  }

  const func2 = function (callback) {
    callback('abc'); // this is passing 'abc' to line 3 of this snippet
  }

  return {
    init: function () {
      func1();
      // func2(); // you don't want to call "func2" here, as "func1" calls it
      // Or you could run:
      func2(function (res) {
        console.log(res);
      });
      // But this makes "func1" redundant
    }
  };
});

Parent().init();

// Output
abc

推荐阅读