为什么不能在函数外部使用声明的变量?

时间:2018-09-03 04:26:52

标签: 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 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 };

2 个答案:

答案 0 :(得分:0)

我认为您代码中的问题在于,您试图在最外部的范围内初始化一个匿名对象

function require(){ /*require code goes here*/ }


let {  remote: { app  }  } = require('electron');

您的最后一个示例起作用是因为匿名对象包装在函数中,因此不在最外层范围内

function require(){ /*require code goes here*/ }

let wrapperFunction = () => {
  let {  remote: { app  }  } = require('electron');
}

console.log("No errors or warnings");

答案 1 :(得分:0)

Electron的remote不是普通的javascript对象,它在被询问时会构造代理对象,并且不会在其模块导出中导出所有可代理名称空​​间:请检查https://github.com/electron/electron/blob/3a79eacb6f44eadb6c17d725755d4278f62993dc/lib/renderer/api/remote.js#L297-L339的内部信息。

意味着,不能保证静态导入中的解构。包裹函数之所以起作用,可能是因为它的代理对象是在应用程序初始化阶段之后构造的,而顶层则不是-不能肯定地说,因为看不到完整的代码流。

在任何情况下,都可能无法尝试通过代理对象进行解构。