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