欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年06月28日 09:03:39   投稿:jingxian  
下面小編就為大家?guī)硪黄P(guān)于JS 預(yù)解釋的相關(guān)理解。小編覺得挺不錯的,現(xià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)文章

最新評論