那就乙個乙個的來吧,
如何查詢上級作用域????其實很簡單,就一句話
這個函式在哪個作用域下定義的,那麼它的上級作用域就是誰,和函式在哪兒執行沒半毛線關係文字描述比較蒼白,看下面的乙個例子吧
//結果都是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 來表示一行的結...