使用尚未声明的变量

Using a variable that has yet to be declared

我在理解 Javascript 称为提升的引擎技术时遇到问题。

我试图在我的文件顶部创建一个 var 以快速访问和编辑,但我想使用一个尚未声明的变量。

第一次尝试:

var easy_to_edit_value = "some text " + a_yet_to_be_defined_var;

//imagine loads of code so its hard to find the correct funtion to edit the log

function my_function (a_yet_to_be_defined_var){
    console.log(easy_to_edit_value);
}
my_function("more text");

这会在第 1 行产生一个错误,因为 a_yet_to_be_defined_var 没有定义。

看了这个 post 之后:post-by-apsillers 我又试了一次,但这次声明了没有值的 var(所以它已知但未定义,直到在 futheron 某处声明)

var a_yet_to_be_defined_var; // now its known so this error is gone
var easy_to_edit_value = "some text " + a_yet_to_be_defined_var;

function my_function (a_yet_to_be_defined_var){
    console.log(easy_to_edit_value);
}
my_function("more text");
//still undefined


//new attempt with a fresh var being set in the function before being called
var new_var;
var easy_to_edit_value = "some text " + new_var;

function my_function2 (a_yet_to_be_defined_var2){
  new_var = a_yet_to_be_defined_var2;
    console.log(easy_to_edit_value);
}
my_function2("more text");
//still undefined

但这会输出:some text undefined 我期待 some text more text 因为我在请求它之前填充了 var。

请注意这些函数不是 运行 使用 my_function("something") 而是由此触发的:client.on('message', my_function);,我已经看到相关问题的箭头函数解决方案,但我不是确定我如何让它在这里工作。

有可能实现这个功能吗?

您需要在函数内部重新声明变量:

var new_var;
var easy_to_edit_value = "some text " + new_var;

function my_function2(a_yet_to_be_defined_var2) {
  new_var = a_yet_to_be_defined_var2;
  easy_to_edit_value = "some text " + new_var;
  console.log(easy_to_edit_value);
}
my_function2("more text");

如果一个变量改变,其他变量将不会根据新值更新。那种编程需要真正高级的编译器,但没有多少人愿意这样做。程序员必须自己更新变量。

不要定义一个名为 easy_to_edit_value 的值,而是将其更改为一个名为 easy_to_call_function 的函数,它将 return "some text " 与 [=14= 的当前值连接起来].

一旦分配了(varlet)变量,每次都必须重新分配或重新计算。

let new_var;
const easy_to_call_function = () => "some text " + new_var;

function my_function2(a_yet_to_be_defined_var2) {
  new_var = a_yet_to_be_defined_var2;
  console.log(easy_to_call_function()); // Call the function
}

my_function2("more text");