JavaScript中變數的作用域是怎樣的?為什麼變數可以先使用再宣告?

時間 2021-05-06 11:50:03

1樓:AKI

本來想貼一下ES5的說明。內容太多。

弱渣用自己的話來闡述一下吧:

首先test是個函式宣告,在執行的時候會產生乙個執行期上下文,它會做如下事情:

1.收集arguments的引數,並初始化其各個變數的值。也就是你傳入的引數是啥,它就是啥。

如果函式宣告是這樣var a = function(b){},a(1)它就是 b:1;你這兒沒有,所以arguments是空。

2.收集FunctionDeclaration,如果跟arguments衝突,就將arguments的值替換掉。

函式宣告是function a(){}不是var a = function(){}

3.收集VariableDeclaration,如果arguments裡沒有,則初始化為undefined。

現在來解釋的話,如果去掉var,則不是變數宣告,相當於全域性的tt="dd"。

不去掉的話,根據上邊的文字推理可得。

2樓:張錚錚

因為後面那個var tt,所以在function內這句之前的tt為undefined,如果去掉var tt,上面那個var tt的作用域就覆蓋function 內了

3樓:顧軼靈

var tt = 'aa';

function test()

test();

改寫成這樣,就明白了。

javascript中,基本型別的變數的賦值語句會在記憶體中產生兩個副本嗎?

唐靜鑫 JS的基本型別是存在棧中的,而且每個基本型別都是單獨儲存在記憶體的不同位址中。所以在日常的開發中,你會發現基本型別的賦值並不會相互影響。 賀師俊 只要保證符合 ECMAScript 規範規定的語義,記憶體裡是幾份是無所謂的。而且就算是兩份,通常你也看不出來。在現代JS引擎中,對字串有各種優化...

javascript中object keys方法使用的問題(實操和書上寫的不相符)?

混混蛋 Object.keys obj 返回obj的自身 不包含原型鏈上的 的所以可列舉屬性的名字陣列 for in迴圈則包含原型鏈.for name in obj Object.getOwnPropertyNames obj 返回obj自身 不含原型鏈上的 的所有屬性名陣列,包括不可列舉的 想要獲...

javascript中Element nodeValue和innerHTML有什麼區別

DOM中的節點是分好幾種型別,常見的有 1.文件節點 document,唯一 2.元素節點 那些個標籤div,p之類 3.屬性節點 class,src這種 4.文字節點 插入在p,div內的文字 其它。其中element.nodeValue,是節點的值,其中屬性節點和文字節點是有值的,而元素節點沒有...