做用域: js沒有塊做用域,只有函數做用域javascript
做用域鏈: 按序檢索對象列表java
自執行函數:擁有私有做用域數組
匿名函數:this -> window函數
初始化: 全局對象, 執行環境棧, 全局執行環境this
類數組(僞數組): 可像數組索引,有length屬性,可是沒有數組的方法,實際上是個對象spa
例: arguments是一個object對象prototype
Array.prototype.slice.call(arguments, 0)是用來將arguments變量轉換爲真正的數組.code
Arguments的屬性callee都會指向當前的被調函數.(可用於遞歸匿名函數)對象
[1] callee與caller遞歸
caller返回一個函數的引用,這個函數調用了當前的函數;
使用這個屬性要注意:
1. 這個屬性只有當函數在執行時纔有用
2. 若是在javascript程序中,函數是由頂層調用的,則返回null
var a = function() {
alert(a.caller);
}
var b = function() {
a();
}
b(); // var b = function() { a(); }
預編譯: 聲明提早(hoisting)
1)函數聲明會置頂
2)變量聲明也會置頂
3)函數聲明 > 變量聲明
4)變量和賦值語句一塊兒書寫,在js引擎解析時,會將其拆成聲明和賦值2部分,聲明置頂,賦值保留在原來位置
5)聲明過的變量不會重複聲明
同一個標識符的狀況下,變量聲明與函數聲明都會提高;函數聲明會覆蓋變量聲明,但不會覆蓋變量賦值,即:若是聲明變量的同時初始化或賦值,
那麼變量優先級高於函數。
*屢次聲明變量,只取最後值
函數表達式
(1) 要清楚二者的區別:
(function {// code})是表達式, function {// code}是函數聲明.
(2) js"預編譯"的特色:
js在"預編譯"階段, 會解釋函數聲明, 但卻會忽略表式.
(3) 當js執行到function() {//code}();時, 因爲function() {//code}在"預編譯"階段已經被解釋過,
js會跳過function(){//code}, 試圖去執行(), 故會報錯;
當js執行到(function {// code})();時, 因爲(function {// code})是表達式, js會去對它求解獲得返回值,
因爲返回值是一 個函數, 故而遇到();時, 便會被執行.
(4) 函數轉換爲表達式的方法並不必定要靠分組操做符(),咱們還能夠用void操做符,~操做符,!操做符……
如:!function(){ alert("另類的匿名函數自執行"); }();