解释这段JavaScript代码

时间:2017-04-28 07:52:33

标签: javascript

我有这段代码:

 var f = function () {
     var x = 1;
     g = function () {
         x = 2;
     };
     g();
     return x;
 };

当像这样运行时:

> f();
> 2
> g();
> undefined
> x;
> undefined

实际上我知道为什么f()会返回1,但现在我有一个新问题:为什么x在调用undefined后返回g()

我在不使用g()关键字的情况下声明了函数var,因此函数g现在位于全局对象中。然后我调用g,我认为函数g应该在值为x的全局对象中创建一个新的全局变量2,因为我没有使用var关键字。但实际上x只是返回undefined,为什么?

无论如何,大家好帮帮我吧!

PS:所有这些代码都在Node.JS REPL中运行。

2 个答案:

答案 0 :(得分:4)

很好地回答你的问题并在此澄清:

  

我认为g()应该返回1,但它是2

没有g()没有返回任何内容,它没有return语句,因此它不会返回1也不会返回2

  

我调用xundefined返回g()的原因是什么?

并且xf函数的本地函数,因此如果您从Uncaught ReferenceError: x is not defined函数外部调用它,它将抛出f

修改

在编辑之后你问:

  

我认为f()应该返回1,但它是2

那么在这种情况下我会说这是正确的行为和调用f()的预期结果,它应该返回2,因为xf()的本地行为函数和g()也可以访问此局部变量,因为它也是f()的本地变量,因此当您在x中将1初始化为f然后调用{{1}在返回g()之前,它会将x设置为x,这就是您获得2的原因。

答案 1 :(得分:-2)

如你所见:

g = function () {
         x = 2;
};

没有返回语句 AND在f的范围内声明(因此无法通过全局范围访问);因此它不会返回任何值(提示未定义)。

f

 var f = function () {
     var x = 1;
     g = function () {
         x = 2;
     };
     g();
     return x;
 };

当您致电f时,它会声明变量x并将其初始化为1。 然后你声明一个修改x的“内部函数”(因为x已经在g之前被声明,它可以通过g的范围访问。{{1}之后您调用它的声明,因此x变为2.因此g的返回值为2.