将局部作用域变量移动到全局作用域,以便我可以将其导入另一个 JS 文件

Moving a local scoped variable to global scope so I can import it to another JS file

提问人:Mwewol 提问时间:11/16/2023 最后编辑:Mwewol 更新时间:11/17/2023 访问量:41

问:

我试图在 javascript 中将 excel 工作表转换为 json 对象,并且在检索最终数据时遇到问题,因为它是在本地确定的。我想将标记为“inputData”的变量导出到另一个 JS 文件,但为了做到这一点,它必须位于文件的顶层,我认为这意味着它必须是全局范围。不过,我一辈子都无法弄清楚如何从其本地范围内获取它。任何帮助将不胜感激。

看一下代码:

let selectedFile;

document.getElementById('input').addEventListener('change', (event) => {
    selectedFile = event.target.files[0];
})
document.getElementById('button').addEventListener('click', () => {

    if (selectedFile) {
        let fileReader = new FileReader();
        fileReader.readAsBinaryString(selectedFile);
        fileReader.onload = (event) => {
            let data = event.target.result;
            let workbook = XLSX.read(data, { type: "binary" })
            let rowObject = XLSX.utils.sheet_to_row_object_array(workbook.Sheets.Grid);
            let newData = rowObject.filter((item, index) => {
                return index === rowObject.findIndex((obj) => {
                    return JSON.stringify(item) === JSON.stringify(obj)
                })
            })

            newData.pop()

            let inputData = JSON.stringify(newData, undefined, 4)
            console.log(inputData)
        }
    }
})
JavaScript 作用域 全局 局部变量

评论

0赞 PM 77-1 11/16/2023
对于基于浏览器的应用:stackoverflow.com/a/3352033/2055998
0赞 Bergi 11/16/2023
只需执行与 - 声明全局不在函数内部一样???inputDataselectedFilelet
0赞 Bergi 11/16/2023
您尝试访问的地点、方式和时间?请注意,这是异步的,因此单击按钮时不会立即分配变量。实际上,您可能应该在生成 JSON 结果后立即调用另一个文件提供的函数。inputDataonload
0赞 Bergi 11/16/2023
您如何在 html 页面中嵌入这些 JS 文件?您使用的是 ES 模块吗?
0赞 Mwewol 11/16/2023
我尝试对inputData作为selectedFile变量执行相同的操作,但它不会导出,并且会收到错误,指出该变量必须位于顶层

答:

-1赞 Viktor Luft 11/16/2023 #1

您可以改为导出可变对象作为引用:

let selectedFile;

export const MyExport = { inputData: undefined };

document.getElementById('input').addEventListener('change', (event) => {
    selectedFile = event.target.files[0];
})
document.getElementById('button').addEventListener('click', () => {

    if (selectedFile) {
        let fileReader = new FileReader();
        fileReader.readAsBinaryString(selectedFile);
        fileReader.onload = (event) => {
            let data = event.target.result;
            let workbook = XLSX.read(data, { type: "binary" })
            let rowObject = XLSX.utils.sheet_to_row_object_array(workbook.Sheets.Grid);
            let newData = rowObject.filter((item, index) => {
                return index === rowObject.findIndex((obj) => {
                    return JSON.stringify(item) === JSON.stringify(obj)
                })
            })

            newData.pop()

            MyExport.inputData = JSON.stringify(newData, undefined, 4)
            console.log(inputData)
        }
    }
})

评论

0赞 Mwewol 11/16/2023
这是否允许我在另一个 JS 文件中的 inputData 变量中使用我的数据?我需要的主要内容是在 onload 事件处理程序中本地范围的数据
0赞 Bergi 11/16/2023
OP问的不是关于inputDataselectedFile
0赞 Viktor Luft 11/17/2023
我已经更新了我的答案。你当然可以随心所欲地命名。MyExport