国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

關(guān)于JS 預(yù)解釋的相關(guān)理解

2019-11-20 09:35:31
字體:
供稿:網(wǎng)友

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頁面的時(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)理解全部內(nèi)容了,希望大家多多支持武林網(wǎng)~

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄂州市| 浦城县| 吉安市| 广东省| 新丰县| 镇江市| 平阳县| 星子县| 古田县| 湖口县| 琼中| 新河县| 上虞市| 绩溪县| 江阴市| 九龙城区| 永清县| 惠来县| 滦南县| 禹州市| 清水县| 乡宁县| 大冶市| 新宾| 房山区| 乾安县| 方山县| 留坝县| 科尔| 侯马市| 自贡市| 双峰县| 东乡县| 桃源县| 沁阳市| 汶川县| 安塞县| 从化市| 新蔡县| 辽宁省| 西乌|