console.
log(a)
;//=>undefined
console.
log(window.a)
;//=>undefined
console.
log(
'a'in window)
;//=>true 在變數提公升階段,在全域性作用域中宣告了乙個變數a,此時就已經把a當做屬性賦值給window了,只不過此時還沒有給a賦值,預設值undefined in:檢測某個屬性是否隸屬於這個物件
var a =12;
//=>全域性變數值修改,win的屬性值也跟著修改
console.
log(a)
;//=>全域性變數a 12
console.
log(window.a)
;//=>window的乙個屬性名a 12
a =13
;console.
log(window.a)
;//=>13
window.a =14;
console.
log(a)
;//=>14
//=>全域性變數和win中的屬性存在 「對映機制」
console.
log(a) 等價於 console.
log(window.a)
,a的本質是window的屬性,而不是變數
var a = b =
1// a帶var,b不帶
console.
log(a, b)
;//=>undefined undefined
var a =12,
b =12;
functionfn(
)fn()
;console.
log(a, b)
;//=>12 13
/*
* 變數提公升:
* var fn; =>只對等號左邊進行變數提公升
* sum = aaafff111;
*/sum()
;fn()
;//=>uncaught typeerror: fn is not a function
//=>匿名函式之函式表示式
varfn
=function()
;//=>**執行到此處會把函式值賦值給fnfn(
);//=>普通的函式
function
sum(
)
/*
* 2.關於重名的處理:如果名字重複了,不會重新的宣告,但是會重新的定義(重新賦值)[不管是變數提公升還是**執行階段皆是如此]
*//*
* 變數提公升:
* fn = ...(1)
* = ...(2)
* = ...(3)
* = ...(4)
*//*
fn();//=>4
function fn()
fn();//=>4
function fn()
fn();//=>4
var fn=100;//=>帶var的在提公升階段只把宣告處理了,賦值操作沒有處理,所以在**執行的時候需要完成賦值 fn=100
fn();//=>100() uncaught typeerror: fn is not a function
function fn()
fn();
function fn()
fn();
*/
console.
log(fn)
;//=>undefinedif(
1===1)
}// console.log(fn);//=>函式本身
let a=
1console.
log(window.a)
// undefined
[堆記憶體釋放]
[棧記憶體釋放]
在私有作用域中,只有以下兩種情況是私有變數
/*
* 變數提公升:
* var a; var b; var c;
* fn = ***...
*/var a =
12,b =
13,c =14;
function
fn(a)
fn(a)
;//=>把fn執行(小括號中是實參:值) =>執行fn把全域性變數a的值12當做實參傳遞給函式的形參 =>fn(12)
console.
log(a, b, c)
;//=>12 13 20
js變數作用域 變數提公升
1 js作用域 在es5中,js只有兩種形式的作用域 全域性作用域和函式作用域,在es6中,新增了乙個塊級作用域 最近的大括號涵蓋的範圍 但是僅限於let方式申明的變數。2 變數宣告 1 var x 變數宣告 2var x 1 變數宣告並賦值 3 x 1 定義全域性變數並賦值 3 函式宣告 func...
作用域與變數提公升
js中變數的作用域有全域性作用域和區域性作用域兩種,作用域簡單來講就是變數與函式的可訪問範圍。宣告提前是在js預編譯是就進行了,變數提公升知識提公升變數的宣告,並不會吧值也提上來。例1 var name one function test var name one function test 解析 ...
變數提公升以及作用域
1 console.log v1 2var v1 100 3function foo 8foo 9console.log v1 10 undefined undefined 200 100 一共有四次列印的動作,分別來看 第一次列印,由於存在變數提公升,第二句中的var v1 100會被提到頂部進行...