Javascript 有没有可能';导入&x27;是否将命名空间(模块)的一部分放入当前范围?
我有一个名为Functionality的模块,它包含许多实用函数。缩写版本如下所示: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
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”。我想我最好仔细阅读一下为什么不推荐它,以了解它为什么被弃用。