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