EcmaScript:将所有方法导入到本地范围

时间:2014-08-05 14:27:37

标签: javascript module namespaces scope

有没有办法将所有方法导入范围而无需限定符?其他语言(如Elm)允许这样做。

ES6规范允许:

import {map, where} from 'underscore'; //unqualified imports by name only
import * as _ from 'underscore'; //with qualifier

但不是这样:

import * from 'underscore';

2 个答案:

答案 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)

根据我的发现:不,没有当前或计划的方式将变量导入本地范围。