【问题标题】:Test for undefined function in Javascript在 Javascript 中测试未定义的函数
【发布时间】:2022-02-19 01:37:37
【问题描述】:

所以 Safari 一直因为一个特定的错误而对我大喊大叫。

我正在尝试使用 Google Maps API 并调用 map.getCenter();。但有时,这会在 map 完全加载之前发生。

因此,我在我的函数中测试undefined 调用,如下所示:

if (map.getCenter() != undefined)

但这仍然会出错,因为我猜它甚至不喜欢打电话只是为了测试结果是否为undefined

我可以在这里寻求帮助吗?

谢谢!

【问题讨论】:

    标签: javascript undefined


    【解决方案1】:

    我实际上更喜欢这些方面的东西。

    if(typeof myfunc == 'function') { 
        myfunc(); 
    }
    

    仅仅因为某些东西不是未定义的并不能使它成为一个函数。

    【讨论】:

    • 除了在这种情况下我猜你想定义一个函数,如果它不存在if(typeof myfunc !== 'function') { myfunc(); }
    • @Henrik 你的评论代码应该是if(typeof myfunc !== 'function') { myfunc = function(){.....}; }
    【解决方案2】:
    if (typeof map !== 'undefined' && map.getCenter) {
       // code for both map and map.getCenter exists
    } else {
      // if they dont exist
    }
    

    这是检查函数是否存在的正确方法。调用函数来测试它的存在会导致错误。

    更新:片段已更新。

    【讨论】:

    • 如果你不打算严格类型(!==),你也可以写if (!map.getCenter)
    • 我回家后会试一试。非常感谢!
    • 不。当我在 smjs 控制台中运行您的示例时,给我“ReferenceError: map is not defined”。
    • 你能告诉我,为什么我的条件在 undefined 没有单引号的情况下工作
    • 请注意:if(typeof FooFunc === 'undefined') { function FooFunc(){} } 不会在 Safari 中定义函数。
    【解决方案3】:
    if (typeof map.getCenter !== 'undefined')
    

    不会抛出错误。

    所以,更好的是,if (typeof map.getCenter === 'function') map.getCenter();

    【讨论】:

      【解决方案4】:

      从技术上讲,您应该测试 map 是否未定义,而不是 map.getCenter()。您不能在未定义的引用上调用函数。

      但是,Google's own tutorial 建议您在 body.onload 处理程序中调用访问 API 的 JavaScript,以便在加载所有远程 .js 文件之前不要尝试引用任何内容 - 您这样做吗?这将永久解决问题,而不是在加载 API 之前执行 JavaScript 时彻底失败。

      【讨论】:

        【解决方案5】:

        我最近养成了使用 typeof 运算符来测试事物和类型的习惯。它将类型作为字符串返回,我认为这样可以避免一些响应类型混淆。

        if( typeof map.getCenter != 'undefined') ...
        

        我不确定它是否更正确,但我发现这个过程有很好的结果。

        【讨论】:

          【解决方案6】:

          您应该测试map 是否未定义。在您当前的检查中,您仍在尝试执行函数调用。

          【讨论】:

            【解决方案7】:

            假设 map.getCenter() 总是一个函数,只使用这个检查就足够了:

            if (map.getCenter) {
                  var x = map.getCenter();
            }
            

            【讨论】:

              【解决方案8】:

              对我来说有效的解决方案是try and catch

              const stopPropagation = (e) => {
                  try {
                      e.stopPropagation();
                  } catch (err) {
                      console.log("error with stopPropagation: " + err.error);
                  }
              }
              
              const triggerClick = (e) => {
                  stopPropagation(e);
              };
              

              【讨论】:

                猜你喜欢
                • 2018-05-12
                • 1970-01-01
                • 2015-07-24
                • 2012-07-04
                • 1970-01-01
                • 2010-10-09
                • 2012-05-18
                • 2011-05-21
                • 2017-06-06
                相关资源
                最近更新 更多