将变量添加到函数作用域/闭包中.函数相当于窗口对象

Add variable to a functions scope / closure. function equivalent of window object

本文关键字:函数 相当于 窗口 对象 闭包 作用域 变量 添加      更新时间:2023-09-26

使用以下代码,我能够从对象中取出值并将它们添加到全局命名空间。这是在expose函数

中定义的
function expose(key, obj){
  window[key] = obj[key];
}

我可以使用它从库中获取我经常使用的函数,例如map from下划线

// before
map               //undefined
_.map             // have to use like this
expose('map', _)
// after
map // function

我想修改暴露,使它做同样的工作,但只在闭包。如何解决这个问题是我想说清楚的。

map //undefined
(function(){
expose('map', {})
// map can be used here 
}())
// map is still undefined here.

我知道在这种情况下这个问题可以用var map = _.map来解决,我在这里给出一个简化的版本来描述这一点。我想用上面描述的方法来解决它,因为我可以编写一个函数,一次暴露多个变量。

关于一个复杂的例子,请看这个repo。

https://github.com/CrowdHailer/cuminjs

在这里可以找到expose函数的测试

https://github.com/CrowdHailer/cuminjs/blob/master/spec/cumin_spec.js

大的例子来更好地表达我想要的最终结果

// file one - sets up some core utilities
var MyModule = (function(){
var foo = function(){
  // ..some functionality
};
return {
  foo: foo
  // plus several more functions
};
}());

// file two - sets up some other functionality.
// Makes use of lots of the functions set up in file 1
(function(parent){
  // var foo = MyModule.foo -trying to avoid as want to use several maybe names change
  expose([foo, etc], MyModule);
  var bar = function(){
    // .. other code would like to make use of foo
  };
  parent.extend({
    bar: bar
  });
}(MyModule))

我知道这个问题在这种情况下可以用var map = _.map来解决。

这正是(唯一的)出路。

我想写一个函数,一次暴露多个变量。

你不应该。看看我对双重问题的回答是否有可能在JavaScript (node.js)中导入变量?

然而,export变量(进入你不拥有的作用域)比import变量(进入你自己的作用域)更复杂。基本上,这是不可能的,因为作用域(除了global)不是可以传递和动态修改的对象。

如何解决这个问题

需要修改要更改/扩展其作用域的函数的代码。我能想到两种方法:

  • use evalexport()将返回一个声明和初始化变量的语句:

    function export() {
        var lines = [];
        for (var p in moduletoexpose)
            lines.push("var "+p+" = require('moduletoexpose')."+p+";");
        return lines.join("'n");
    }
    (function() {
        eval(export(…));
        // use `map` here
    }())
    
  • 类似地,您可以编写一个函数,该函数接受闭包,对其进行反编译,将变量声明添加到代码中,并使用Function构造函数从闭包创建一个函数。可以像

    这样使用
    exportTo(…, function() {
        // use `map` here
        // don't use any free variables but global ones
    })();
    

    听起来不如eval解决方案好,但是您可能想要查看如何编写这样的exportTo的答案的灵感。