關(guān)于JS 預(yù)解釋的相關(guān)理解
1、JS中的內(nèi)存空間分為兩種:棧內(nèi)存、堆內(nèi)存
棧內(nèi)存:提供JS代碼執(zhí)行的環(huán)境;存儲基本數(shù)據(jù)類型的值; ->全局作用域或者私有的作用域其實都是棧內(nèi)存
堆內(nèi)存:存儲引用數(shù)據(jù)類型的值(對象是把屬性名和屬性值存儲進去,函數(shù)是把函數(shù)體中的代碼當(dāng)做字符串存儲進去)
2、當(dāng)瀏覽器加載我們HTML頁面的時候,首先會提供一個供JS代碼執(zhí)行的環(huán)境->全局作用域(global->window)
3、在JS代碼執(zhí)行之前,瀏覽器還需要自己做一些事情:把所有帶var/function關(guān)鍵字的進行提前的聲明或者定義 ->"預(yù)解釋"(變量提聲)
聲明(declare) -> 告訴瀏覽器我有這樣一個東西啦,例如 var num1; function fn;
定義(defined) -> 給我們聲明的變量或者函數(shù)賦值,例如 num1=12; fn=function(){}
[重要]變量只聲明沒有定義,默認的值是undefined(未定義)
4、var和function在預(yù)解釋階段處理是不一樣的
var -> 在預(yù)解釋的時候只是提前的聲明了這個變量,只有當(dāng)代碼執(zhí)行的時候才會完成賦值操作
function -> 在預(yù)解釋的時候會提前的把聲明加定義都完成了(在代碼執(zhí)行的時候遇到定義的代碼直接的跳過)
[重要]剛開始只對window下的進行預(yù)解釋,fn函數(shù)中目前存儲的都是字符串,所以var total沒啥實際的意義,所以不進行預(yù)解釋 -> "預(yù)解釋是發(fā)生在當(dāng)前作用域下的"
console.log(obj);//->undefined var obj = {name: "張珊珊", age: 10}; function fn(num1, num2) {//代碼執(zhí)行到這一行的時候直接的跳過,因為在預(yù)解釋的時候我們已經(jīng)完成了聲明加定義 var total = num1 + num2; console.log(total); } var num1 = 12; fn(num1, 100);//執(zhí)行fn,把全局變量num1的值賦值給形參num1,把100賦值給形參num2
5、在全局作用域下聲明的變量是全局變量
在私有作用域中聲明的變量是私有變量;函數(shù)的形參也是私有的變量;
如何分辨函數(shù)中出現(xiàn)的變量是私有的還是全局的?
首先看是否為形參,然后看是否在私有作用域中聲明過(有沒有var過),兩者有其一就是私有的變量,那么在當(dāng)前函數(shù)中不管什么位置出現(xiàn)都是私有的,和全局的沒有半毛錢的關(guān)系;如果兩者都沒有,說明不是私有的,則往其上一級作用域進行查找...
6、函數(shù)執(zhí)行的時候會形成一個新的私有的作用域(棧內(nèi)存),供函數(shù)體中的代碼執(zhí)行;
1)給形參賦值
2)私有作用域下的預(yù)解釋
3)私有作用域下的代碼執(zhí)行
形成的新的私有的作用域還保護了里面的私有變量不受外界的影響,我們把函數(shù)的這種保護機制->"閉包
區(qū)別:帶var的可以在代碼執(zhí)行前進行聲明,而不帶var的不能提前的聲明
1、不管條件是否成立都要進行預(yù)解釋
window預(yù)解釋:var a; -> window.a; if (!("a" in window)) {//"a" in window -> true var a = "我們"; } console.log(a);//->undefined
2、預(yù)解釋只發(fā)生在"="的左邊,只把左邊的進行預(yù)解釋,右邊的是值是不進行預(yù)解釋的
匿名函數(shù)之函數(shù)表達式:把函數(shù)定義的部分當(dāng)做值賦值給一個變量或者元素的事件
預(yù)解釋的時候:var fn; ->fn的默認值是undefined
fn();//->undefined() Uncaught TypeError: fn is not a function JS中只有函數(shù)可以執(zhí)行 && JS上面的代碼如果報錯了,在不進行任何的特殊處理情況下我們下面的代碼都不在執(zhí)行了 var fn = function () { console.log("ok"); }; fn(); 預(yù)解釋的時候:fn=xxxfff000 fn();//->"ok" function fn() { console.log("ok"); } fn();//->"ok"
3、函數(shù)體中return下面的代碼都不在執(zhí)行了,但是下面的代碼需要參加預(yù)解釋;而return后面的東西是需要處理的,但是由于它是當(dāng)做一個值返回的,所以不進行預(yù)解釋;
var total = 300; function fn() { console.log(total); return function sum() {};//return是把函數(shù)中的值返回到函數(shù)的外面,這里是把function對應(yīng)的內(nèi)存地址返回的到函數(shù)的外面,例如:return xxxfff111;函數(shù)體中return下面的代碼都不在執(zhí)行了 var total = 10; } fn();
4、匿名函數(shù)的function在全局作用域下是不進行預(yù)解釋的
匿名函數(shù)之自執(zhí)行函數(shù):定義和執(zhí)行一起完成了
(function(num){})(100);
5、在預(yù)解釋的時候,如果遇到名字重復(fù)了,只聲明一次,不重復(fù)的聲明,但是賦值還是要重復(fù)的進行的
在JS中變量的名字和函數(shù)的名字如果一樣是算作重復(fù)的
預(yù)解釋:
var fn; 聲明 fn = xxxfff000; [聲明]不要了+定義 fn = xxxfff111; [聲明]不要了+定義 ->fn=xxxfff111 var fn = 12;//window.fn=12 function fn() {//window.fn=function(){} } function fn() { }
以上就是小編為大家?guī)淼年P(guān)于JS 預(yù)解釋的相關(guān)理解全部內(nèi)容了,希望大家多多支持腳本之家~
相關(guān)文章
在JavaScript中處理字符串之fontcolor()方法的使用
這篇文章主要介紹了在JavaScript中處理字符串之fontcolor()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-06-06JavaScript sup方法入門實例(把字符串顯示為上標(biāo))
這篇文章主要介紹了JavaScript sup方法入門實例,sup方法用于把字符串顯示為上標(biāo),需要的朋友可以參考下2014-10-10關(guān)于JavaScript限制字數(shù)的輸入框的那些事
這篇文章主要介紹了關(guān)于JavaScript限制字數(shù)的輸入框在項目過程中容易遇到的各種坑的匯總,非常的詳細,有需要的小伙伴可以參考下2016-08-08JavaScript_object基礎(chǔ)入門(必看篇)
下面小編就為大家?guī)硪黄狫avaScript_object基礎(chǔ)入門(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06javascript彈出窗口 window.open使用方法以及參數(shù)說明分析篇
window.open是網(wǎng)頁中經(jīng)常遇到的彈出窗口代碼,不是網(wǎng)絡(luò)中比較反感的那類彈出代碼。用于新頁面?zhèn)髦?,回傳等?/div> 2009-12-12最新評論