JS學習的幾點思考(一)

1,js裏面的類數組,實際上之前一直被誤導爲json,即var a ={‘name’:’eric’,’age’:18},這其實是js裏面類數組,具有數組的length屬性,即a.length=2,但是沒有具有數組的一些方法,要對類數組進行操作的話,就要通過Array.prototype.splice[此處是數組具有的方法].call(a,參數,參數)。引用個例子

function printArgs() {
    Array.prototype.forEach.call(arguments,
        function (arg, i) {
            console.log(i+'. '+arg);
        });
}

> printArgs()
    > printArgs('a')
    0. a
    > printArgs('a', 'b')
    0. a
    1. b

這裏用call的第二個參數是函數,js裏面函數也是對象,可以理解爲處理函數。下面的例子是’正常‘的call

 > var obj = {};
    > Array.prototype.push.call(obj, 'a');
    1
    > obj
    { '0': 'a', length: 1 }

參考傳送門

2,函數的原型鏈。每一個對象都有proto,只有函數纔有prototype。JS在聲明一個函數的時候,會爲該函數對象創建一個私有的prototype,當new這個函數的時候,js創建該函數的實例,並且把實例的proto 指向函數的prototype,並且繼承該函數prototype的所有屬性和方法。prototype是用來共享信息的,構造函數中的賦值都是私有的,無法共享的。形象的理解構造函數的prototype在最金字塔的最頂層,當prototype發生改變的時候,會共享數據改變。
學習傳送門

3,關於構造函數的繼承

4,js閉包。通俗一點理解就是,在全局中訪問函數的局部變量,這隻需在函數裏面嵌套函數,在嵌套函數(子)裏面訪問父的變量,並且把這個函數返回。
閉包會引起內存泄漏,解決的方法是在函數退出之前,刪除局部變量。這是阮一峯老師在博客說的,但是網上又說閉包的內存泄漏是IE的問題。下面介紹下js的垃圾回收:
mark-and-sweep,主要有兩種方法,一種是標記法,GC在變量運行的時候維護一個roots表,所有的全局變量都會在這個表裏面,首先被標記爲激活狀態,然後檢查這個root以及下面的子變量是可到達,如果不可到達,就會被去掉。另外一種是計數法,當聲明瞭一個變量,並且這個變量被其他的變量引用的時候,就會被增加一個計數,當引用變量不對這個變量引用的時候,就變-1,當爲0的時候,啓動GC。(互相引用的時候無法刪除)
幾種引起內存泄漏: 在局部函數沒有用var導致成爲全局變量,回調函數沒有即使刪除,脫離DOM的引用(標記清除不了)
傳輸門一 傳送門二 阮一峯老師閉包教程
5,event和e的區別。主要是不兼容的產生的不同命名。此外說下困擾很久的問題,在js當中,實際參數和形參不是對應的,所以沒有傳入event也會默認有,和argument一樣是存在的。一般來說,要var eve = e || windows.event。在此展開一下event事件的方法:
阻止冒泡,e.stopPropagation(); window.event.cancelBubble = true;舉個栗子:

<div id='div' onclick='alert("div");'>
<ul onclick='alert("ul");'>
<li onclick='alert("li");'>test</li>
</ul>
</div>

阻止默認行爲:e.preventDefault(),windows.returnValue=true;(要判斷是否有默認行爲)
傳送門

明天繼續๑乛◡乛๑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章