爲什麼下面的代碼導致日誌記錄爲b
,而a
仍然爲undefined
?IIFE和javascript中的全局範圍
(function(){ var a=b=5; })();
console.log('b:'+b);
console.log('a:'+a);
爲什麼下面的代碼導致日誌記錄爲b
,而a
仍然爲undefined
?IIFE和javascript中的全局範圍
(function(){ var a=b=5; })();
console.log('b:'+b);
console.log('a:'+a);
因爲var a=b=5;
語句定義只有本地a
變量,其實這樣解釋
var a = (b=5);
相等於
b = 5;
var a = 5;
其分配5
到全局b
變量,定義了一個局部變量爲a
。
適當的方式來定義2個局部變量而不值重複將是
var b = 5, a = b;
變量可以以兩種方式來定義:
第一種方式,a
是一個局部變量,但是在seco nd方式,它成爲一個全局變量。
所以,當你做var a=b=5
,b
是一個全局變量,因此保留價值。
在JavaScript中,如果您在變量之前省略了var關鍵字,它將被視爲全局變量。 所以這裏b是一個全局變量,而a只是該函數的一個局部範圍。 這就是爲什麼在訪問a時出現錯誤。
謝謝@samrat,'嚴格'模式揭示了破解。 –
@ B.D。不用謝。 :) –
沒關係,我想通了,因爲它不會讓我睡覺。
在IIFE內有兩項任務,而只有一項聲明。
聲明var a=b=5;
聲明變量a
與var
但只是爲其他變量b
分配。 b
實際上從來沒有在這裏聲明,只是分配 - 使其成爲全局變量。
因此b
對外界日誌聲明功能,打印其作爲5
價值訪問。
換句話說,在「嚴格」模式,代碼如下所示:
(function() {
'use strict';
var a = window.b = 5;
})();
console.log(b);
什麼是「拳頭方法」和「第二個方法」你指的是? – zerkms