首頁 >web前端 >js教程 >關於JS 預解釋的詳細解讀

關於JS 預解釋的詳細解讀

亚连
亚连原創
2018-05-21 09:19:051381瀏覽

下面我就為大家帶來一篇關於JS 預解釋的相關理解。現在就分享給大家,也給大家做個參考。

1、JS中的記憶體空間分為兩種:堆疊記憶體、堆疊記憶體

堆疊記憶體:提供JS程式碼執行的環境;儲存基本資料類型的值; ->全域作用域或私有的作用域其實都是棧記憶體

堆記憶體:儲存引用資料型別的值(物件是把屬性名稱和屬性值儲存進去,函數是把函數體中的程式碼當做字串儲存進去)

2、當瀏覽器載入我們HTML頁面的時候,首先會提供一個供JS程式碼執行的環境->全域作用域(global-> window)

3、在JS程式碼執行之前,瀏覽器還需要自己做一些事情:把所有帶var/function關鍵字的進行提前的聲明或者定義->"預解釋" (變數提聲)

宣告(declare) -> 告訴瀏覽器我有這樣一個東西啦,例如var num1; function fn;

定義(defined) -> 給我們宣告的變數或函數賦值,例如num1=12; fn=function(){}

# [重要]變數只宣告沒有定義,預設的值是undefined(未定義)

4、var和function在預解釋階段處理是不一樣的

var -> 在預解釋的時候只是提前的聲明了這個變數,只有當程式碼執行的時候才會完成賦值運算

function -> 在預先解釋的時候會提前的把宣告加定義都完成了(在程式碼執行的時候遇到定義的程式碼直接的跳過)

[重要]剛開始只對window下的進行預解釋,fn函數中目前存儲的都是字符串,所以var total沒啥實際的意義,所以不進行預解釋-> "預解釋是發生在當前作用域下的"

console.log(obj);//->undefined
 var obj = {name: "张珊珊", age: 10};
 function fn(num1, num2) {//代码执行到这一行的时候直接的跳过,因为在预解释的时候我们已经完成了声明加定义
var total = num1 + num2;
 console.log(total);
 }
 var num1 = 12;

 fn(num1, 100);//执行fn,把全局变量num1的值赋值给形参num1,把100赋值给形参num2

5、在全域作用域下宣告的變數是全域變數

在私有作用域中宣告的變數是私有變數;函數的形參也是私有的變數;

如何分辨函數中出現的變數是私有的還是全域的?

首先看是否為形參,然後看是否在私有作用域中宣告過(有沒有var過),兩者有其一就是私有的變數,那麼在當前函數中不管什麼位置出現都是私有的,和全局的沒有半毛錢的關係;如果兩者都沒有,說明不是私有的,則往其上一級作用域進行查找...

6、函數執行的時候會形成一個新的私有的作用域(棧內存),供函數體中的代碼執行;

1)給形參賦值
2)私有作用域下的預解釋
3)私有作用域下的程式碼執行

#形成的新的私有的作用域也保護了裡面的私有變數不受外界的影響,我們把函數的這種保護機制->"閉包

區別:帶var的可以在程式碼執行前進行聲明,而不帶var的不能提前的陳述

1、不管條件是否成立都要進行預解釋

window预解释:var a; -> window.a;
 if (!("a" in window)) {//"a" in window -> true
 var a = "我们";
 }
console.log(a);//->undefined

2、預解釋只發生在"="的左邊,只把左邊的進行預解釋,右邊的是值是不進行預解釋的

#匿名函數之函數表達式:把函數定義的部分當做值賦值給一個變數或元素的事件

預先解釋的時候:var fn; ->fn的預設值是undefined

fn();//->undefined() Uncaught TypeError: fn is not a function JS中只有函数可以执行 && JS上面的代码如果报错了,在不进行任何的特殊处理情况下我们下面的代码都不在执行了
var fn = function () {
 console.log("ok");
 };
 fn();

预解释的时候:fn=xxxfff000
 fn();//->"ok"
 function fn() {
 console.log("ok");
 }
 fn();//->"ok"

 3、函數體內return下面的程式碼都不在執行了,但是下面的程式碼需要參加預解釋;而return後面的東西是需要處理的,但是由於它是當做一個值返回的,所以不進行預解釋;

var total = 300;
 function fn() {
 console.log(total);
 return function sum() {};//return是把函数中的值返回到函数的外面,这里是把function对应的内存地址返回的到函数的外面,例如:return xxxfff111;函数体中return下面的代码都不在执行了
var total = 10;
 }
 fn();

4、匿名函數的function在全局作用域下是不進行預先解釋的

匿名函數之自執行函數:定義和執行一起完成了

(function(num){})(100);

5、在預解釋的時候,如果遇到名字重複了,只聲明一次,不重複的聲明,但是賦值還是要重複的進行的

在JS中變量的名字和函數的名字如果同樣是算重複的

預解釋:

var fn; 声明
fn = xxxfff000; [声明]不要了+定义
fn = xxxfff111; [声明]不要了+定义
->fn=xxxfff111
 var fn = 12;//window.fn=12
 function fn() {//window.fn=function(){}
 }
 function fn() {
 }

上面是我整理給大家的,希望今後會對大家有幫助。

相關文章:

利用Js實作刪除陣列中某一項或幾項的幾種方法

詳談js中內建物件Math的屬性與方法(一目了然)

#JSON物件(圖文教學,簡單粗暴)

#

以上是關於JS 預解釋的詳細解讀的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn