1.如何區(qū)分私有變量和全局變量柒凉?
? ? ? ? 1)在全局作用域下聲明(預(yù)解釋的時(shí)候上)的變量是全局變量
? ? ? ? 2)在“私有作用域中聲明的變量”和“函數(shù)的形參”都是私有變量
? ? ? ? 在私有作用域中媒楼,我們代碼執(zhí)行的時(shí)候遇到了一個(gè)變量榛鼎,首先我們需要確定它是否為私有的變量叼风,如果是私有的變量,那么和外面的沒有任何的關(guān)系;如果不是私有的,則往當(dāng)前作用域的上級(jí)作用域進(jìn)行查找惜互,如果上級(jí)作用域也沒有則繼續(xù)查找布讹,一直找到window為止 ...(作用域鏈)
? ? 2.當(dāng)函數(shù)執(zhí)行的時(shí)候(直接目的:讓函數(shù)體中的代碼執(zhí)行)琳拭,首先會(huì)形成一個(gè)新的私有的作用域,然后按照如下的步驟執(zhí)行:
? ? ? ? 1)如果沒有形參描验,先給形參賦值
? ? ? ? 2)進(jìn)行私有作用域中的預(yù)解釋
? ? ? ? 3)私有作用域中的代碼自上而下執(zhí)行
? ? ? ? ...
? ? ? ? 4)函數(shù)形成一個(gè)新的私有的作用域保護(hù)了里面的私有變量不受外界干擾(外面修改不了里面的)白嘁,私有的也修改不了外面的-》閉包
? ? ? ? 閉包:閉包是一種機(jī)制,函數(shù)執(zhí)行的時(shí)候形成了一個(gè)私有的作用域膘流,保護(hù)里面的私有變量不受外界干擾絮缅。
? ? ? ?
? ? ? ? //預(yù)解釋的時(shí)候不管你的條件是否成立鲁沥,都要把帶var的進(jìn)行提前的聲明
? ? ? ? //window的預(yù)解釋:var num; -> window.num
? ? ? ? if(!('num' in window)){
? ? ? ? ? ? var num = 12;
? ? ? ? }
? ? ? ? console.log(num)? // undefined
? ? 3.執(zhí)行函數(shù)定義的那個(gè)function在全局作用域下不進(jìn)行預(yù)解釋,當(dāng)代碼執(zhí)行到這個(gè)位置的時(shí)候定義和執(zhí)行一起完成了
? ? // 自執(zhí)行函數(shù):定義和執(zhí)行一起完成了,不進(jìn)行預(yù)解釋
? ? (function(num){})(100)
? ? ~function(num){}(100
? ? +function(num){}(100)
? ? -function(num){}(100)
? ? !function(num){}(100)
? ?
? ? 4.函數(shù)體中的return下面的代碼雖然不在執(zhí)行了耕魄,但是需要進(jìn)行預(yù)解釋;return后面跟著的都是我們的返回值画恰,所以不進(jìn)行預(yù)解釋。
? ? ? ? function fn(){
? ? ? ? ? ? console.log(num); // undefined
? ? ? ? ? ? return function(){
? ? ? ? ? ? ? ?
? ? ? ? ? ? };
? ? ? ? ? ? var num = 10;
? ? ? ? }
? ? ? ? fn();
? ? 5.在預(yù)解釋的時(shí)候吸奴,如果名字已經(jīng)聲明過了允扇,不需要重新聲明,但是需要重新賦值则奥;在JS中如果變量的名字和函數(shù)的名字重復(fù)了考润,也算沖突
? ? 預(yù)解釋:var fn; window.fn; fn = xxxfff000 window.fn = xxxfff000
? ? ? ? var fn = 10;
? ? ? ? function fn(){
? ? ? ? ? ? console.log('ok');
? ? ? ? }