Javascript 有没有可能';导入&x27;是否将命名空间(模块)的一部分放入当前范围?

Javascript 有没有可能';导入&x27;是否将命名空间(模块)的一部分放入当前范围?,javascript,namespaces,Javascript,Namespaces,我有一个名为Functionality的模块,它包含许多实用函数。缩写版本如下所示: MYAPP.functionalUtilities = (function() { function map(func, array) { var len = array.length; var result = new Array(len); for (var i = 0; i < len; i++) result[i] = func(array[i]); return resu

我有一个名为Functionality的模块,它包含许多实用函数。缩写版本如下所示:

MYAPP.functionalUtilities = (function() {
function map(func, array) {
  var len = array.length;
  var result = new Array(len);
  for (var i = 0; i < len; i++)
    result[i] = func(array[i]);
  return result;
}
return {
    map:map,
};
})();
var obj = {
    "my prop": 1
};
每次我想使用
map
时都要记得键入
f.map,这看起来既麻烦又烦人。当然,在依赖项中,我可以通过输入以下各项功能:

var map = f.map,
forEach = f.forEach,
等等

但我想知道是否有更好的方法?我读过的许多关于名称空间的文章都提到了别名,但没有提出一种“将对象的所有内容导入范围”的排序方法

非常感谢您的帮助

罗宾

[编辑]为了澄清,我想在
MYAPP.main
中使用我的功能实用程序(
map
等),而不必每次都在前面加上
f.


这可以通过遍历
MYAPP.functionalities
中的每个函数,并分配给
MYAPP.main
中的局部范围变量来实现。但这所需要的代码数量并不能证明它的好处,而且它不是一个通用的解决方案。

正如我在评论中所说的。没有真正的方法可以从对象属性中自动定义局部变量。我唯一想到的是使用eval:

for (var i in MYAPP.functiionalUtilities) {
    eval("var " + i + " = MYAPP.functiionalUtilities[i];");
}
但我不会使用此方法,因为可以使用字符串作为键的对象属性,如下所示:

MYAPP.functionalUtilities = (function() {
function map(func, array) {
  var len = array.length;
  var result = new Array(len);
  for (var i = 0; i < len; i++)
    result[i] = func(array[i]);
  return result;
}
return {
    map:map,
};
})();
var obj = {
    "my prop": 1
};
“my prop”可能是对象属性的有效键,但不是有效标识符。因此,我建议只编写
f.prop
或使用
var prop=f.prop
手动定义局部变量

编辑


正如Felix Kling在评论部分提到的,事实上还有另一种实现这一点的方法,使用with语句,我对它了解不多,只是它被否决了。

这里是一个迟来的答案-我想补充一下basilikum的答案

1) 带有
关键字的
在这里可能很有用!

在某些方面,带有
关键字的
正是针对这种情况而设计的。当然,应该注意的是,mozilla开发者链接不鼓励将
一起使用,并且在严格模式下也禁止将
一起使用。另一个问题是
with
语句导致其参数成为作用域链的头部,这意味着总是首先检查
with
块中所有语句的所有标识符。这可能是一个性能的打击

2) basilikum答案的改进 虽然函数调用无法将项添加到其父框架的作用域中,但有一种方法可以避免在每次希望将项列表添加到命名空间时键入for循环

// First, define a multi-use function we can use each time
// This function returns a string that can be eval'd to import all properties.
var import = function(module) {
    var statements = [];
    for (var k in module) statements.push('var ' + i + ' = module["' + i + '"]');
    return statements.join(';');
};

// Now, each time a module needs to be imported, just eval the result of import
eval(import(MYAPP.functiionalUtilities));
map(console.log, [ 'this', 'works!' ]);
这里的想法是用
eval(import(MYAPP.functionalUtilities))之类的东西来代替编写for循环的需要


正如basilikum所说,这里的危险在于模块属性必须是有效的标识符名称。

我认为使用
var map=f.map
手动定义局部变量是可行的。您可能找不到任何将对象属性作为局部变量自动“导入”的方法。
with
可以做到这一点(),但在严格模式下禁止使用(即,它的用法总体上不推荐使用)。当然!由于媒体报道不好,我忘记了“with”。我想我最好仔细阅读一下为什么不推荐它,以了解它为什么被弃用。