您可以更改使用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
。