将变量添加到函数作用域/闭包中.函数相当于窗口对象
Add variable to a functions scope / closure. function equivalent of window object
使用以下代码,我能够从对象中取出值并将它们添加到全局命名空间。这是在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
eval
。export()
将返回一个声明和初始化变量的语句: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
的答案的灵感。
相关文章:
- es6 相当于下划线查找位置
- 什么's是相当于LINQ's SelectMany运算符
- JavaScript相当于Smalltalk开发周期
- UWP webView相当于Android中的addJavascriptInterface()
- PHP 相当于 JavaScript 中的 Date.UTC 函数
- 使用函数继承时相当于“实例”
- Dojo相当于jQuery.text函数
- Java相当于JavaScript的反转义函数
- Symfony 2相当于Symfony 1中的url_for()函数
- 有没有相当于JavaScript's Array.prototype.some()函数
- 将变量添加到函数作用域/闭包中.函数相当于窗口对象
- Javascript相当于PHP的unpack()函数
- 在emberjs组件中,什么'相当于Angular'的指令链接函数?
- 相当于jQuery的YUI Lang.子函数
- 函数之前的原型相当于jQuery
- js令牌替换(相当于在ASP.NET中调用内联函数)
- 相当于change()函数的slideToggle()
- 函数式编程 - OCaml 相当于 JavaScript 的 'apply'
- 相当于jQuery的Prototype收集和映射函数
- 相当于JavaScript'对象模型中的析构函数