關(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(){}
[重要]變量只聲明沒(méi)有定義,默認(rèn)的值是undefined(未定義)
4、var和function在預(yù)解釋階段處理是不一樣的
var -> 在預(yù)解釋的時(shí)候只是提前的聲明了這個(gè)變量,只有當(dāng)代碼執(zhí)行的時(shí)候才會(huì)完成賦值操作
function -> 在預(yù)解釋的時(shí)候會(huì)提前的把聲明加定義都完成了(在代碼執(zhí)行的時(shí)候遇到定義的代碼直接的跳過(guò))
[重要]剛開(kāi)始只對(duì)window下的進(jìn)行預(yù)解釋,fn函數(shù)中目前存儲(chǔ)的都是字符串,所以var total沒(méi)啥實(shí)際的意義,所以不進(jìn)行預(yù)解釋 -> "預(yù)解釋是發(fā)生在當(dāng)前作用域下的"
console.log(obj);//->undefined
var obj = {name: "張珊珊", age: 10};
function fn(num1, num2) {//代碼執(zhí)行到這一行的時(shí)候直接的跳過(guò),因?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)的變量是私有的還是全局的?
首先看是否為形參,然后看是否在私有作用域中聲明過(guò)(有沒(méi)有var過(guò)),兩者有其一就是私有的變量,那么在當(dāng)前函數(shù)中不管什么位置出現(xiàn)都是私有的,和全局的沒(méi)有半毛錢(qián)的關(guān)系;如果兩者都沒(méi)有,說(shuō)明不是私有的,則往其上一級(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ī)?lái)的關(guān)于JS 預(yù)解釋的相關(guān)理解全部?jī)?nèi)容了,希望大家多多支持腳本之家~
相關(guān)文章
Javascript & DHTML 實(shí)例編程(教程)DOM基礎(chǔ)和基本API
Javascript & DHTML 實(shí)例編程(教程)DOM基礎(chǔ)和基本API...2007-06-06
解讀JavaScript中 For, While與遞歸的用法
本篇文章對(duì)JavaScript中 For, While與遞歸的用法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05
淺談JavaScript_DOM學(xué)習(xí)篇_圖片切換小案例
這篇文章主要介紹了JavaScriptDOM圖片切換小案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
簡(jiǎn)介JavaScript中的setTime()方法的使用
這篇文章主要介紹了簡(jiǎn)介JavaScript中的setTime()方法的使用,是JS入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06
JavaScript中數(shù)組繼承的簡(jiǎn)單示例
這篇文章主要介紹了JavaScript中數(shù)組繼承的簡(jiǎn)單示例,數(shù)組繼承是JavaScript入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-07-07
JavaScript 基礎(chǔ)知識(shí) 被自己遺忘的
JavaScript 基礎(chǔ)知識(shí) 被自己遺忘的,學(xué)習(xí)的朋友可以參考下。2009-10-10

