Почему нельзя использовать переменные, объявленные вне функции? - PullRequest
0 голосов
/ 03 сентября 2018

Этот код должен работать, но появляется сообщение об ошибке «Невозможно восстановить

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 голосов
/ 03 сентября 2018

Electron's remote не является обычным объектом javascript, он создает прокси-объект при его запросе и не экспортирует все пространство имен с поддержкой прокси в своем экспорте модуля: проверьте https://github.com/electron/electron/blob/3a79eacb6f44eadb6c17d725755d4278f62993dc/lib/renderer/api/remote.js#L297-L339 на наличие внутренних объектов.

Значит, деконструкция при статическом импорте не гарантируется. Обернутая функция может работать, если ее прокси-объект создается после этапа инициализации приложения, в то время как верхний уровень этого не делает - пока точно не могу сказать, поскольку не может видеть потоки полного кода.

В любых случаях нельзя пытаться деконструировать объект прокси.

0 голосов
/ 03 сентября 2018

Я думаю, что проблема в вашем коде состоит в том, что вы пытаетесь инициировать анонимный объект в самой внешней области видимости

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");
...