【问题标题】:JavaScript running order questionsJavaScript 运行顺序问题
【发布时间】:2021-11-19 00:03:31
【问题描述】:

我有一个非常简单的 Javascript 代码,无法完全理解运行顺序和输出。

function f1() {

    n = 999;

    change = function() {
        n = "Barry";
    };
    return change;

}

var result = f1();

result(); 
console.log(n)
change();
console.log(n)

输出:

Barry
Barry

据我了解,我定义了一个全局变量 n,并且 n = 999。 然后我创建了一个将 globalen 定义为“Barry”的函数。并将此功能分配给更改。并返回此更改变量。

然后我触发这个 f1(),并对结果进行更改。在这个时间点,更改是一个函数,但尚未运行。

那么为什么第一个 Console.log 会返回我的 Barry?然后更改还没有运行..

【问题讨论】:

  • 继续问自己“如果change 是全局变量,返回它有什么意义?”

标签: javascript closures


【解决方案1】:

您没有使用varletconst 在范围内正确声明变量,因此它污染了全局或外部范围。

n 已更改,因为 result === changechangen 设置为 Barry

【讨论】:

  • 拜托,我知道在环境中设置的方式不正确。我只是想知道这个bahaive的原因。
  • @PEIRANLIU 阅读第二段 - 这就是原因。您也可以使用调试器来跟踪代码流。
  • 感谢 Daniel,我得到了结果 ===change,但是当我返回它时,change 是一个变量。当我返回它时,它会自动运行功能吗?
  • @PEIRANLIU 你打电话给result
  • emm.. 由于我调用了 result(),所以调用了 f1()。它返回给我一个将 n 设置为 barry 的函数.....但是.... 这就是所谓的匿名函数吗?我认为它只是返回函数而不运行它......
【解决方案2】:

这种行为的原因就在这一行,

var result = f1(); // n - 999

此时您正在调用内部函数并将 n 设置为 Barry

result(); // n - Barry

我不确定你是如何直接调用这个函数的。但希望它只是一个伪代码

change(); // n - Barry

这意味着,

 result() === change()

【讨论】:

  • 非常感谢,我现在完全明白了。
【解决方案3】:

当你调用结果函数时,这里是序列。

function f1(){
  //declares n variable
  //declares change function
  //return change function, and calls it, at this point it changes n to "barry".
}

【讨论】:

  • 知道了,非常感谢!
【解决方案4】:

为什么第一个 Console.log 会返回我的 Barry?然后更改还没有运行..

是的,您只是在调用result() 之后才调用console.log。请尝试以下操作:

var n, change;
function f1() {

    n = 999;

    change = function() {
        n = "Barry";
    };
    return change;

}

console.log(n);
var result = f1();
console.log(result === change);
console.log(n);
result(); 
console.log(n);
change();
console.log(n);

【讨论】:

  • 非常感谢。我现在明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2016-03-04
  • 2021-11-30
  • 1970-01-01
相关资源
最近更新 更多