有没有办法将所有方法导入范围而无需限定符?其他语言(如Elm)允许这样做。
ES6规范允许:
import {map, where} from 'underscore'; //unqualified imports by name only
import * as _ from 'underscore'; //with qualifier
但不是这样:
import * from 'underscore';
答案 0 :(得分:2)
在没有破坏全局命名空间的情况下,我想不出一个好方法。但是,如果window
对象将被删除,也可以将其作为其他人的对象。
其他人,iframe
。我认为这是一个有趣的方法,如果有任何潜在的陷阱,请发表评论,我会尝试解决它们。
基本上会发生的是iframe将被创建。它将有一个脚本元素,其内容将是传递的匿名函数。它的范围将是完全沙箱,除了传入的任何全局变量(以及它们的关联设置器,如果需要返回值)。
是强>
功能
键入:功能({设置})
允许使用本地化环境
设置
类型:PlainObject
一组配置环境的键/值对。目前没有错误处理。
LIB
类型:PlainObject
该参数应该是本地化全局环境中使用的库。
FN
类型:功能
这将是在本地环境下执行的匿名函数。
全球
类型:PlainObject
全局参数将允许在本地化环境和外部上下文之间进行通信。使用键值对,键将是在本地化环境中可用的名称。将使用该值(在这种情况下应使用外部环境的值),或该值将是一个setter(在这种情况下,外部环境的值将在函数末尾更新)执行)。这是一个设计松散的实现,如果需要,可以适应更多情况。
<强> jsFiddle Demo
强>
使用函数的定义
function using(args){
var lib = args.lib;
var callback = args.fn;
var global = args.global;
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.contentWindow.exec = function() {
for(var fn in lib){
this[fn] = lib[fn];
}
for(var val in global){
this[val] = global[val];
}
var scr = document.createElement("script");
scr.innerHTML = "("+callback+")()";
iframe.contentWindow.document.body.appendChild(scr);
};
iframe.contentWindow.exec();
for(var val in global){
if(global[val] instanceof Function)
global[val](iframe.contentWindow[val]);
}
iframe.parentNode.removeChild(iframe);
}
演示中使用的代码
var stooges;
var list = document.querySelectorAll(".hello");//just a set of 5 divs classed as hello with w,o,r,l,d in them respectively
using({
lib: _,
global: {
"stooges":function(val){ stooges = val; },
"list":list
},
fn: function(){
function toUpperCase(x){
return x.toUpperCase();
}
function minSize(len){
return function(str){
return str.length >= len;
}
}
stooges = map(filter(["Larry", "Curly", "Moe"], minSize(4)), toUpperCase);
each(list,function(el){console.log(el.innerHTML);});
}
});
console.log(stooges);
答案 1 :(得分:1)
根据我的发现:不,没有当前或计划的方式将变量导入本地范围。