Javascript 为什么可以';在函数外部声明的t变量是否可以在函数内部使用?

Javascript 为什么可以';在函数外部声明的t变量是否可以在函数内部使用?,javascript,ecmascript-6,electron,node-modules,Javascript,Ecmascript 6,Electron,Node Modules,此代码应该可以工作,但错误消息是“无法解构” const fs = require('fs'); let { remote: { app } } = require('electron'); let userDataPath = app.getPath('userData'); let filePath = path.join(userDataPath, 'preferences.json') const readPreferences = () => { return

此代码应该可以工作,但错误消息是“无法解构”

const fs = require('fs');
let {  remote: { app  }  } = require('electron');  
let userDataPath = app.getPath('userData');
let filePath = path.join(userDataPath, 'preferences.json')

const readPreferences = () => {
    return JSON.parse( fs.readFileSync(filePath) )
}
const writePreferences = (inputs) => { 
    inputs && fs.writeFileSync(filePath, JSON.stringify(inputs));
}

module.exports = {readPreferences, writePreferences };
但是,如果我在每个函数中添加所有
let
变量,代码就会工作

这正常吗?为什么会这样

应该在那里重复这些吗

我在一个单独的演示中尝试了这一点,一切都很好:

// - two.js
let two = "this is something"
exports.one = () => {  
    return two
}

// - index.js
const { one } = require('./two')
let two = "anything"
console.log(one()) // -> this is something
编辑:这是可行的

const fs = require('fs');    
const readPreferences = () => {
let {  remote: { app  }  } = require('electron');  
let userDataPath = app.getPath('userData');
let filePath = path.join(userDataPath, 'preferences.json')
    return JSON.parse( fs.readFileSync(filePath) )
}
const writePreferences = (inputs) => { 
let {  remote: { app  }  } = require('electron');  
let userDataPath = app.getPath('userData');
let filePath = path.join(userDataPath, 'preferences.json')
    inputs && fs.writeFileSync(filePath, JSON.stringify(inputs));
}

module.exports = {readPreferences, writePreferences };

我认为代码中的问题在于,您试图在最外层的作用域中初始化一个匿名对象

function require(){/*require代码在这里*/}

让{remote:{app}}=require('electron');
electron的
remote
不是普通的javascript对象,它在被请求时构造代理对象,并且不导出其模块导出中的所有可代理命名空间:检查内部

也就是说,静态导入中的解构是不能保证的。包装函数可以工作的原因是,它的代理对象是在应用程序初始化阶段之后构造的,而顶层并没有,也不能确定,因为无法看到完整的代码流


在任何情况下,都不能尝试对代理对象进行解构。

唯一相关的是“无法解构”。转到特定行,并在SSCCE中将其拉出。在右侧尝试不同的值,直到找到“相关原因”(即最小故障案例)。这将非常方便。它在其他页面上工作,并且在函数中声明时工作?请使用“var”关键字而不是“let”进行检查。因为与“var”不同(后者全局定义变量,或局部定义整个函数,而不考虑块范围)。如果我们在函数外部使用“let”声明变量,那么它在函数内部找不到该变量的值,而该变量未绑定到函数的作用域。选择作为写入答案是因为它提供了信息。谢谢。我后来使用了
electron.remote.app
where
electron=require(“electron”)