【问题标题】:How to check if a namespaced function exists?如何检查命名空间函数是否存在?
【发布时间】:2013-09-10 05:04:51
【问题描述】:

有没有办法找出命名空间中的函数是否存在?我正在尝试获取 HTML 元素的属性值,然后检查字符串值是否具有相应的 JavaScript 函数。

<a id="myLink" href="http://stackoverflow.com/" data-success-callback="$.Namespace.SomeFunction" />

var successCallback = $('#myLink').data('success-callback');

我知道我可以使用 typeof window[callback] === 'function' 来检查全局声明的函数,但这似乎不适用于命名空间中的函数;它是未定义的。

有没有办法解决这个问题?

谢谢你:)

【问题讨论】:

标签: javascript namespaces javascript-namespaces


【解决方案1】:

假设回调是您的 successCallback 对象,执行 window[callback] === 'function' 只会检查窗口对象的根目录是否存在名为 '$.Namespace.SomeFunction' 的对象.但是您要实现的是检查 $ 对象中包含的对象 Namespace 本身是否有一个名为 SomeFunction 的对象。

为此,如果您已经知道命名空间和函数,您可以使用@rps 写的又名 typeof typeof myNamespace.myFunc 或使用下面的函数来遍历对象并查找给定路径,在您的情况下 $ .Namespace.SomeFunction :

var get = function (model, path, def) {
    path = path || '';
    model = model || {};
    def = typeof def === 'undefined' ? '' : def;
    var parts = path.split('.');
    if (parts.length > 1 && typeof model[parts[0]] === 'object') {
      return get(model[parts[0]], parts.splice(1).join('.'), def);
    } else {
      return model[parts[0]] || def;
    }
  } 

现在做类似的事情

typeof get(window, '$.Namespace.SomeFunction', 'undefined') === 'function'

【讨论】:

  • 嗨!为什么只返回 jQuery 命名空间?
【解决方案2】:

我用这个代替:

function getProperty(objName) {
    var parts = objName.split('.');
    for (var i = 0, length = parts.length, obj = window; i < length; ++i) {
        obj = obj[parts[i]];
    }
    return obj;
}

在这里得到它:Access namespaced javascript object by string name without using eval

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2015-08-17
    • 1970-01-01
    • 2011-02-06
    • 2014-04-19
    • 2012-01-19
    • 2013-10-03
    相关资源
    最近更新 更多