42

我正在使用主干设置一个非常简单的应用程序,但出现错误。

Uncaught TypeError: undefined is not a function example_app.js:7
ExampleApp.initialize example_app.js:7
(anonymous function)

这是 Chrome Inspector 中出现错误的地方(初始化文件 - example_app.js):

var ExampleApp = {
  Models: {},
  Collections: {},
  Views: {},
  Routers: {},
  initialize: function() {
    var tasks = new ExampleApp.Collections.Tasks(data.tasks);
    new ExampleApp.Routers.Tasks({ tasks: tasks });
    Backbone.history.start();
  }
};

这是我的任务 index.haml 文件

- content_for :javascript do
  - javascript_tag do
    ExampleApp.initialize({ tasks: #{raw @tasks.to_json} });

= yield :javascript

模型/task.js

var Task = Backbone.Model.extend({});

集合/tasks.js

var Tasks = Backbone.Collection.extend({
    model: Task,
    url: '/tasks'
});

路由器/tasks.js

ExampleApp.Routers.Tasks = Backbone.Router.extend({
    routes: {
        "": "index"
    },

    index: function() {
        alert('test');
        // var view = new ExampleApp.Views.TaskIndex({ collection: ExampleApp.tasks });
        // $('body').html(view.render().$el);
    }
});

这是我正在调用所有文件的证据(我认为):

<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery-ui.js?body=1" type="text/javascript"></script>
<script src="/assets/underscore.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone-support/support.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone-support/composite_view.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone-support/swapping_router.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone-support.js?body=1" type="text/javascript"></script>
<script src="/assets/example_app.js?body=1" type="text/javascript"></script>
<script src="/assets/easing.js?body=1" type="text/javascript"></script>
<script src="/assets/modernizr.js?body=1" type="text/javascript"></script>
<script src="/assets/models/task.js?body=1" type="text/javascript"></script>
<script src="/assets/collections/tasks.js?body=1" type="text/javascript"></script>
<script src="/assets/views/task_view.js?body=1" type="text/javascript"></script>
<script src="/assets/views/tasks.js?body=1" type="text/javascript"></script>
<script src="/assets/views/tasks_index.js?body=1" type="text/javascript"></script>
<script src="/assets/routers/tasks.js?body=1" type="text/javascript"></script>
<script src="/assets/tasks/index.js?body=1" type="text/javascript"></script>
<script src="/assets/tasks/task.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>

任何想法都会很棒。谢谢!

4

4 回答 4

84

Uncaught TypeError: undefined is not a function example_app.js:7

此错误消息讲述了整个故事。在这一行中,您正在尝试执行一个函数。但是,正在执行的不是函数!相反,它是undefined.

那么example_app.js第 7 行是什么?看起来像这样:

var tasks = new ExampleApp.Collections.Tasks(data.tasks);

在那条线上只运行一个函数。我们发现了问题!ExampleApp.Collections.Tasksundefined

因此,让我们看看声明的位置:

var Tasks = Backbone.Collection.extend({
    model: Task,
    url: '/tasks'
});

如果这就是这个集合的所有代码,那么根本原因就在这里。您将构造函数分配给全局变量,称为Tasks. 但是您永远不会将它添加到ExampleApp.Collections对象中,这是您以后期望它存在的地方。

把它改成这个,我打赌你会很好。

ExampleApp.Collections.Tasks = Backbone.Collection.extend({
    model: Task,
    url: '/tasks'
});

看看正确的名称和行号在弄清楚这一点方面有多重要?永远不要将错误视为二进制(它有效或无效)。而是阅读错误,在大多数情况下,错误消息本身会为您提供需要追踪以找到真正问题的关键线索。


在 Javascript 中,当你执行一个函数时,它的评估如下:

expression.that('returns').aFunctionObject(); // js
execute -> expression.that('returns').aFunctionObject // what the JS engine does

这种表达方式可能很复杂。所以当你看到undefined is not a function它意味着表达式没有返回一个函数对象。所以你必须弄清楚为什么你试图执行的不是一个函数。

在这种情况下,这是因为你没有把东西放在你认为你做的地方。

于 2012-11-22T00:29:27.197 回答
1

我在下面的例子中发生了同样的错误 -

async.waterfall([function(waterCB) {
    waterCB(null);
}, function(**inputArray**, waterCB) {
    waterCB(null);
}], function(waterErr, waterResult) {
    console.log('Done');
});

在上面的瀑布函数中,我在瀑布 2nd 函数中接受 inputArray 参数。但是这个 inputArray 没有传入 waterCB 中的第一个瀑布函数。

检查你的函数参数下面是一个正确的例子。

async.waterfall([function(waterCB) {
    waterCB(null, **inputArray**);
}, function(**inputArray**, waterCB) {
    waterCB(null);
}], function(waterErr, waterResult) {
    console.log('Done');
});

谢谢

于 2020-05-14T08:51:39.513 回答
0

[笑话模式开启]

您可以通过添加以下内容来解决此问题:

https://github.com/donavon/undefined-is-a-function

import { undefined } from 'undefined-is-a-function';
// Fixed! undefined is now a function.

[笑话模式关闭]

于 2020-10-15T13:08:46.283 回答
0

如果在 MongoDB 中使用 async-await ,请在 mongo 调用之前检查是否缺少 await。

const [assistantError, assistant] = await assistantDb.findOneAssistant({
      _id: assistantId,
    });

这里如果缺少等待,以后使用助手时,可能会出现此问题。

于 2021-12-09T15:30:31.133 回答