我有这段代码:
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中运行。
答案 0 :(得分:4)
很好地回答你的问题并在此澄清:
我认为
g()
应该返回1
,但它是2
。
没有g()
没有返回任何内容,它没有return
语句,因此它不会返回1
也不会返回2
。
我调用
x
后undefined
返回g()
的原因是什么?
并且x
是f
函数的本地函数,因此如果您从Uncaught ReferenceError: x is not defined
函数外部调用它,它将抛出f
。
修改强>
在编辑之后你问:
我认为
f()
应该返回1
,但它是2
。
那么在这种情况下我会说这是正确的行为和调用f()
的预期结果,它应该返回2
,因为x
是f()
的本地行为函数和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.