JS 基礎知識複習

2022-06-09 14:21:07 字數 2553 閱讀 3603

那就乙個乙個的來吧,

如何查詢上級作用域????其實很簡單,就一句話

這個函式在哪個作用域下定義的,那麼它的上級作用域就是誰,和函式在哪兒執行沒半毛線關係

文字描述比較蒼白,看下面的乙個例子吧

//結果都是120,因為返回的函式是定義在fn裡面,而fn裡面的num=120,所以結果都是120
關於記憶體釋放和作用域銷毀!!

例子1

function fn()

}var f=fn()

例子2

點我啊

//script

~function()

}()

其實這個不銷毀的原理和上面的是一樣的,因為dom元素也是乙個物件,預設情況下,dom元素物件裡面的onclick屬性=null,但是我們給他賦值為乙個方法之後,導致這個方法被本作用域外不引用了,請看下圖

js資料型別分為基本資料型別和複雜資料型別,複雜資料型別基本就是指物件了(包括,物件,陣列,函式)

基本資料型別都儲存在記憶體的棧中

複雜資料儲存在堆中

js在執行的過程中,會先預解釋,也就是變數提公升,然後在從上往下執行,碰到複雜型別資料,就在放在堆中,並且將位址賦值給棧中的變數

這裡需要提一下,函式在定義的時候,堆裡面只是存的是函式體裡面的字串,等到函式執行的時候,會將**放到棧裡面來執行

函式在執行的時候,會在棧裡面開闢出乙個空間,作為函式的私有作用域,然後裡面也會有一系列的流程

1,形參賦值

2,預解釋

3,從上往下執行

執行完之後,一般會將這個棧空間銷毀,也叫出棧。

這裡又會引出乙個概念,閉包,這個空間就不會被銷毀

要形成閉包呢,需要在乙個私有作用域中,也就是乙個大函式中,返回乙個引用型別的資料,最關鍵的地方是,這個返回的資料要被賦值給外面的乙個變數,這樣子,在這個作用域之外的地方也有變數引用了這個資料,此時就形成了閉包。

之前呢,我一直以為函式裡面返回了函式,就形成了閉包,事實上不是,還需要非常關鍵的被外界引用

然後就是this指向了。

this指向的是當前行為的執行主體,js裡面還有context(上下文)的概念,就是這個主體所處在的環境(區域),

例如:張三 在 沙縣 吃雲吞 =》this就是張三,context就是沙縣小吃,行為就是吃雲吞,this和context沒有啥必然聯絡,張三可以在沙縣吃,也可以在上海小混沌吃,對吧

this的指向與方法在哪兒定義和在哪兒執行沒有啥關係,那麼如何判斷this指向呢,很簡單,下面的規律

1,如果某個函式前面有「.」,那麼這個「.」前面是誰,this就是誰,如果沒有「.」,那this就指向window

2,自執行函式裡面的this永遠指向window

3,給元素中的某乙個事件繫結方法,當事件觸發的時候,執行對應的方法,方法中的this就指向當前元素

`html

點我啊function fn()

var obj=;

fn(); //this=>window

obj.fn() // this=>obj

function sun()

sun();

var oo=

}oo.sum()

document.getelementbyid("#div1").onclick=fn //此時fn裡面的this指向#div1

document.getelementbyid("#div1").onclick=function()

//上面是規律,下面看看一道面試題

var num = 20;

var obj =

})(num)

};var fn = obj.fn;

fn(); //65

obj.fn();//85

console.log(window.num, obj.num); //240 120

這是例子

var obj=

}obj.say(); //張三

var o1=obj.say

o1();// this指向window

在來乙個例子
function fn(name)

}var f1=new fn("張三");

f1.say() //say 函式裡面的this 指向需要say執行的時候來確定 此時say前面的「.」前面是f1,那麼這this指向的就是f1

// 建構函式裡面的this.name的this就是指向具體的例項,這裡就是指向f1,雖然結果一樣,但是兩個的原理不一樣

這是乙個系列,不過放一片文章裡面還是太長了,後續還是分出不同的標題吧

寫篇文章真是不容易呀,那些大佬寫的那麼些高質量的文章 真不知道肝了多少精力和腦細胞。

基礎知識複習

總結 1.閉包 閉包的好處就是讓乙個變數常駐記憶體,供後續的程式使用 2.檢視乙個物件是可迭代物件的方法 1 使用dir 函式.如果結果中有 iter 就是可迭代物件 print dir obj 2 通過isinstance 函式,返回true就是可迭代物件 from collections imp...

c基礎知識複習

c的發展歷程 c原本是為了開發unix作業系統而設計的語言 如此說,應該c比unix更早問世,而事實並非如此,最早的unix是由彙編寫的 c語言本來是美國人開發的,解讀c的宣告,最好還是用英語來讀 解讀c宣告的步驟 1 首先著眼於識別符號 變數名或者函式名 2 從距離識別符號最近的地方開始,依照優先...

DayOne C 基礎知識複習

在c 中,一般在標頭檔案 h 中定義,然後在原始檔 cpp 中進行實現。舊版c 中使用 ifndef key endif 來確保標頭檔案只引用了一次,保證不會迴圈引用。最新的編譯器使用 pragma once指令來確保不會出現迴圈引用。使用endl來表示一行輸出的結尾,或者是使用 n 來表示一行的結...