【问题标题】:Why can't variables declared outside a function be used within it?为什么在函数外部声明的变量不能在函数内部使用?
【发布时间】:2019-02-08 02:54:18
【问题描述】:

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

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 };

【问题讨论】:

  • 唯一相关的是“无法解构”。转到 specific 行,然后在 SSCCE 中将其拉出。尝试在右侧使用不同的值,直到找到“相关原因”(即最小故障情况)。 read a reference on ES6 destructuring rules 会很方便。
  • 它在其他页面上确实有效,并且在函数中声明时有效?
  • 检查使用 'var' 关键字而不是 'let'。因为不像'var'(它在全局范围内定义一个变量,或者在本地定义一个整个函数,而不管块范围如何)。如果我们在函数外部使用 'let' 声明一个变量,那么它不会在函数内部找到该变量的值,该值未绑定到函数的范围。

标签: javascript ecmascript-6 electron node-modules


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 之所以选择写答案,是因为它提供了丰富的信息。谢谢。从那以后我就选择了electron.remote.app,为什么electron = require("electron")
    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2020-08-31
    • 2023-04-03
    相关资源
    最近更新 更多