您可以更改使用toString()
和可怕的eval
功能范围。
如果你的职能是在说lib.js如下: -
var lib = {}
lib.foo = function() { console.log(var1) }
lib.bar = function() { console.log(var2) }
module.exports = lib
在main.js你可以有这样的: -
var var1 = 1
var var2 = 2
var ob1 = require('./lib')
ob1.foo()
ob1.bar()
当你运行它的ob1.foo( )行给出一个ReferenceError,var1没有定义。这是因为foo()的作用域来自lib.js而不是你的主要js文件,而var1对它来说是不可见的。 ob1.foo是对具有lib.js作用域的函数的引用。您需要使用main.js作用域创建新的引用。
为此相互转换功能串和eval它。这将创建一个具有相同代码但具有main.js范围的新函数。这里有一种使用setMainScope方法的方法,该方法遍历所有将其作用域更改为main.js的函数。
var var1 = 1
var var2 = 2
var ob1 = {}
ob1.setMainScope = function(ob2) {
for(var prop in ob2) {
if(!ob2.hasOwnProperty(prop)) {continue}
if(typeof ob2[prop] !== 'function') {continue}
this[prop] = eval("(" + ob2[prop].toString() + ")")
}
}
ob1.setMainScope(require('./lib'))
ob1.foo() // 1
ob1.bar() // 2
现在所有的作品很好,但用eval
。的foo()
和bar()
范围现在是main.js,所以他们“看到” var1
和var2
。