【问题标题】:Javascript Namespaces and undefined functionJavascript 命名空间和未定义的函数
【发布时间】:2016-12-22 16:50:47
【问题描述】:

有人能解释一下如何正确地做到这一点

foo(); //outputs 'foo'

function foo(){
   console.log('foo');
}

但这给出了“函数未定义”错误

MY_NAME_SPACE ={};

MY_NAME_SPACE.foo(); //undefined

MY_NAME_SPACE.foo = function(){
   console.log('foo');
}    

我可以看到,在第二个示例中,调用是在将函数添加到 My_NAME_SPACE 对象之前进行的,但如果是这种情况,如果排序很重要,如何使用这种类型的“命名空间”?

【问题讨论】:

  • 要更清楚一点......我知道这个错误正在发生,因为我在它被声明/添加到对象之前调用了该函数。但是,我正在阅读有关使用这种类型的“命名空间”来避免具有重复名称等的函数的信息,但您现在似乎不得不担心代码/函数的顺序?
  • 您只是在创建命名空间之前不会使用它?

标签: javascript namespaces undefined


【解决方案1】:

是的,如果您要使用此命名空间模式,则需要先创建并填充命名空间,然后再尝试调用方法或访问尚未分配给命名空间的属性值。

而不是定义命名空间对象,然后定义命名空间中的每个连续方法,例如:

var MY_NAME_SPACE = {};

MY_NAME_SPACE.foo = function() {
    console.log('foo');
}

我更喜欢使用所谓的module pattern,因为我希望包含在MY_NAME_SPACE 中的方法可视地包装在模块中:

var  MY_NAME_SPACE = (function () {

    var foo = function () {
        console.log('foo');
    };

    return { foo: foo };

})();


MY_NAME_SPACE.foo()

此外,如果您希望包装在命名空间或模块中的方法是独立且可重用的,则创建一个单独的文件(可能是 my_name_space.js)并将此文件包含在需要访问方法的项目中是有意义的MY_NAME_SPACEMY_NAME_SPACE API)。

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 2015-11-14
    • 1970-01-01
    • 2016-10-28
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多