Javascript 未为模块库定义变量
我一直在重构我的App.js文件,并将一些函数放到一个名为utilities.js的文件中。每个函数都有一个导出,my App.js有必要的导入。但是,我得到了一些utilities.js文件中未定义“myVariable”的错误。我想这是因为我在App.js文件中的App()函数之外声明了变量,因此如果单独查看utilities.js文件,就不会声明变量。此pieceTable变量也用于App.js中的其他函数 你如何处理这种情况 例如: utilities.js文件Javascript 未为模块库定义变量,javascript,reactjs,Javascript,Reactjs,我一直在重构我的App.js文件,并将一些函数放到一个名为utilities.js的文件中。每个函数都有一个导出,my App.js有必要的导入。但是,我得到了一些utilities.js文件中未定义“myVariable”的错误。我想这是因为我在App.js文件中的App()函数之外声明了变量,因此如果单独查看utilities.js文件,就不会声明变量。此pieceTable变量也用于App.js中的其他函数 你如何处理这种情况 例如: utilities.js文件 export const
export const findPieces = piece => {
pieceTable = [];
// blah blah
}
App.js文件
import {findPieces} from './utilities'
let pieceTable=[];
function App() {
const findDraught = findPieces('King')
}
对于这种类型的场景,我得到一个“编译失败”错误,说“pieceTable”没有在utilities中定义。js我的函数不是纯函数。调用pieceTable时,我需要将它作为参数传入,这样可以避免所有这些问题。不要让我的utilities.js文件依赖于另一个文件中的全局变量。将参数传递给这些实用程序函数。在
utilities.js
中没有定义它,因为没有let
或const
如果不想在utilities函数中重新定义它,那么在调用findPieces
时需要传入pieceTable
当你说时,让pieceTable=[]
您明确地将pieceTable
作为一个变量,其作用域是模块的局部变量,即而不是全局变量
如果您刚刚引用了pieceTable
,那么您将为顶级作用域对象分配一个属性,该对象是window
(在浏览器JavaScript上下文中)。您可以使用:window.pieceTable
显式引用它
(仅供参考,在node.js中,它将是global.pieceTable
)
Globals是passé,我不建议在您的案例中使用Globals
如果你不想全球化,但你仍然想要模块化设计
为pieceTable
选择所属模块,并将该模块导出。然后让需要引用的所有其他模块导入它。这是利用模块机制而不是全局机制
如果你想要纯粹的设计
设计函数,使其以
pieceTable
(或将pieceTable
作为属性的对象)的值作为参数传递给函数,而不是依赖于获取单例或全局参数。这将使您的函数更易于测试,并消除令人困惑的全局副作用。请分享一些代码我现在已经这样做了。您在utilities中做错了。jscont pieceTable=[]在utilities.js中是正确的,但pieceTable是一个全局变量,也用于App.js文件中的其他函数。这不会有影响吗?你应该使用react Redux谢谢你的详细回答。我现在已经重构了很多代码,我发现为了保持函数的纯净,我必须传入大量的参数。再说一次,我想这是要付出的代价。