调用未定义的函数时,Javascript不会抛出错误

时间:2016-07-15 17:02:09

标签: javascript node.js

我正在编写一个使用缓存系统的nodejs / reactjs应用程序。 我遇到了一个错误,其中组件中从未显示缓存中的数据,我最终发现cache.isEmpty()的行应该是cache.isempty()。 在这种情况下Javascript没有抛出任何错误,只是停止执行。另一方面,如果我在其他地方进行调用,比如在if语句之前,它通常会抛出一个错误并告诉我函数没有定义。那是为什么?

read: function (apiCall, data, cacheKey, ttl, putQuery, retrieveQuery) {
        if (cache.expired(cacheKey, ttl)) {
            console.log('cache is expired');
            api.call(apiCall,data, (response) => {
                console.log(response);
                db[putQuery](response);
                db[retrieveQuery](data, (result) => {
                    cache.set(cacheKey, result);
                    cache.refresh(cacheKey);
                    render();
                });
            });
        } else if (cache.isEmpty()) {
            console.log('cache is empty');
            db[retrieveQuery](data, (result) => {
                cache.set(cacheKey, result);
                render();
            });
        }
        console.log('cache is ready');
    },

如果您需要更多详细信息,请与我们联系。

编辑:为了说清楚,两种情况之间的唯一区别是,一次在else if语句中调用该函数,另一次是它不是。在这两种情况下,呼叫都以相同的方式发生

1 个答案:

答案 0 :(得分:1)

  

在这种情况下,Javascript没有抛出任何错误,只是停止执行。

是的,是的,它正在抛出TypeError,因为你试图调用undefined,这是不可调用的。但无论是什么函数调用该异常而不是让它可用(或者以你的代码没有检查的方式将它提供给你)。

因此,解决方案是检查调用代码的文档,以查看它是否以不同方式报告错误。这很常见,因为异常跟踪不会跨越异步边界传播。

这是一个吃/抑制异常的例子:

function foo(obj) {
  obj.undefinedMethod();
}
try {
  foo({});
} catch (e) {
  console.log("Got an error");
}

// But if the caller suppresses it, converting it to
// something else... This example converts it to a return value
function bar() {
  try {
    foo({});
    return true;
  } catch (e) {
    return false;
  }
}
console.log("Before calling bar");
bar();
console.log("After calling bar");