所以我在下面的代码中使用了IIFE函数。我的函数 MinWrite 在其范围之外查找 glVal (它在IIFE函数中声明,因此它必须查看外部范围)并成功找到glVal:
//test.js
var glVal = 3;
var Stuff = (function() {
return {
MinWrite: function() {
console.log(glVal - 2);
}
}
})();
Stuff.MinWrite(); // returns 1
但是当我遇到这种情况时:
var glVal = 3;
var Stuff = require('./test1');
Stuff.MinWrite(); // returns "glVal is not defined"
module.exports = {
MinWrite: function() {
console.log(glVal - 2);
}
};
它返回错误:" glVal未定义"。据我所知,当我们需要一个模块时,模块包装就会发生,并将代码包装在IIFE中的模块(test1.js)中。所以要求是一种平等的#34;到IIFE宣布。那么为什么我的代码在第二种情况下不起作用呢?
答案 0 :(得分:3)
函数可以访问的作用域取决于声明函数的位置,而不是函数的调用位置。
两个JS模块是不同的范围。您在test2
中创建的函数无权访问test1
中声明的任何变量。
require
模块使其导出在test1
中可用,但它不会更改它可以访问的范围。
如果要在导出的函数中使用test1
中的数据,则需要更改该函数以接受参数,然后将其传递。