[英]Interpreting this piece of JavaScript code
我有以下代碼:
var f = function () {
var x = 1;
g = function () {
x = 2;
};
g();
return x;
};
像這樣運行時:
> f();
> 2
> g();
> undefined
> x;
> undefined
實際上我知道為什么f()
返回1,但是現在我有一個新問題:為什么x
在調用g()
之后返回undefined
?
我聲明了函數g()
而不使用var
關鍵字,因此函數g
現在位於全局對象中。 然后我調用g
,我認為函數g
應該在全局對象中創建一個新的全局變量x
,值2
因為我沒有使用var
關鍵字。 但是實際上x
只是返回undefined
,為什么?
無論如何,請大家幫我!
PS:所有這些代碼都在Node.JS REPL中運行。
好在這里回答您的問題並進行澄清:
我以為
g()
應該返回1
但是它是2
。
沒有g()
不返回任何東西,它沒有return
語句,因此它不會返回1
或2
。
為什么在調用
g()
之后x
返回undefined
?
並且x
是f
函數的局部變量,因此它將拋出Uncaught ReferenceError: x is not defined
如果Uncaught ReferenceError: x is not defined
從f
函數外部調用Uncaught ReferenceError: x is not defined
。
編輯:
編輯后,您詢問:
我以為
f()
應該返回1
但是應該是2
。
好吧,在那種情況下,我會說這是正確的行為,並且是調用f()
的預期結果,它應該返回2
因為x
是f()
函數的局部變量,而g()
可以訪問此局部變量,因為它是f()
局部變量f()
也是如此,因此當您將f
x
初始化為1
,然后在返回x
之前調用g()
,會將x
設置為2
,這就是為什么得到2
的原因。
如你看到的 :
g = function () {
x = 2;
};
沒有退貨聲明 在 ; 因此它不會返回任何值(提示未定義)。 f
的范圍內聲明AND(因此無法通過全局范圍訪問)
對於f
:
var f = function () {
var x = 1;
g = function () {
x = 2;
};
g();
return x;
};
調用f
它聲明變量x
並將其初始化為1。然后聲明一個修改x
的“內部函數”(由於x
在g
之前已聲明,因此可以通過g
的范圍對其進行訪問。在g
的聲明之后)您調用它,因此x變為2。因此f
的返回值為2。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.