閉包就是可以讀取其餘函數內部變量的函數javascript
閉包是指有權訪問另外一個函數做用域中變量的函數,建立閉包的最多見的方式就是在一個函數內建立另外一個函數,經過另外一個函數訪問這個函數的局部變量,利用閉包能夠突破做用鏈域html
閉包的特性:java
說說你對閉包的理解webpack
使用閉包主要是爲了設計私有的方法和變量。閉包的優勢是能夠避免全局變量的污染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易形成內存泄露。在js中,函數即閉包,只有函數纔會產生做用域的概念web
閉包 的最大用處有兩個,一個是能夠讀取函數內部的變量,另外一個就是讓這些變量始終保持在內存中ajax
閉包的另外一個用處,是封裝對象的私有屬性和私有方法正則表達式
好處:可以實現封裝和緩存等;sql
壞處:就是消耗內存、不正當使用會形成內存溢出的問題數據庫
使用閉包的注意點json
因爲閉包會使得函數中的變量都被保存在內存中,內存消耗很大,因此不能濫用閉包,不然會形成網頁的性能問題,在IE中可能致使內存泄露
解決方法是,在退出函數以前,將不使用的局部變量所有刪除
做用域鏈的做用是保證執行環境裏有權訪問的變量和函數是有序的,做用域鏈的變量只能向上訪問,變量訪問到window
對象即被終止,做用域鏈向下訪問變量是不被容許的
簡單的說,做用域就是變量與函數的可訪問範圍,即做用域控制着變量與函數的可見性和生命週期
每一個對象都會在其內部初始化一個屬性,就是prototype
(原型),當咱們訪問一個對象的屬性時
若是這個對象內部不存在這個屬性,那麼他就會去prototype
裏找這個屬性,這個prototype
又會有本身的prototype
,因而就這樣一直找下去,也就是咱們平時所說的原型鏈的概念
關係:instance.constructor.prototype = instance.__proto__
特色:
JavaScript
對象是經過引用來傳遞的,咱們建立的每一個新對象實體中並無一份屬於本身的原型副本。當咱們修改原型時,與之相關的對象也會繼承這一改變當咱們須要一個屬性的時,Javascript
引擎會先看當前對象中是否有這個屬性, 若是沒有的
就會查找他的Prototype
對象是否有這個屬性,如此遞推下去,一直檢索到 Object
內建對象
事件代理(Event Delegation
),又稱之爲事件委託。是 JavaScript
中經常使用綁定事件的經常使用技巧。顧名思義,「事件代理」便是把本來須要綁定的事件委託給父元素,讓父元素擔當事件監聽的職務。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好處是能夠提升性能
能夠大量節省內存佔用,減小事件註冊,好比在table
上代理全部td
的click
事件就很是棒
能夠實現當新增子對象時無需再次對其綁定
構造繼承
原型繼承
實例繼承
拷貝繼承
原型prototype
機制或apply
和call
方法去實現較簡單,建議使用構造函數與原型混合方式
function Parent(){ this.name = 'wang'; } function Child(){ this.age = 28; } Child.prototype = new Parent();//繼承了Parent,經過原型 var demo = new Child(); alert(demo.age); alert(demo.name);//獲得被繼承的屬性 }
this
老是指向函數的直接調用者(而非間接調用者)new
關鍵字,this
指向new
出來的那個對象this
指向觸發這個事件的對象,特殊的是,IE
中的attachEvent
中的this
老是指向全局對象Window
冒泡型事件:當你使用事件冒泡時,子級元素先觸發,父級元素後觸發
捕獲型事件:當你使用事件捕獲時,父級元素先觸發,子級元素後觸發
DOM
事件流:同時支持兩種事件模型:捕獲型事件和冒泡型事件
阻止冒泡:在W3c
中,使用stopPropagation()
方法;在IE下設置cancelBubble = true
阻止捕獲:阻止事件的默認行爲,例如click - <a>
後的跳轉。在W3c
中,使用preventDefault()
方法,在IE
下設置window.event.returnValue = false
建立一個空對象,而且 this
變量引用該對象,同時還繼承了該函數的原型
屬性和方法被加入到 this
引用的對象中
新建立的對象由 this
所引用,而且最後隱式的返回 this
Ajax
的原理簡單來講是在用戶和服務器之間加了—箇中間層(AJAX
引擎),經過XmlHttpRequest
對象來向服務器發異步請求,從服務器得到數據,而後用javascrip
t來操做DOM
而更新頁面。使用戶操做與服務器響應異步化。這其中最關鍵的一步就是從服務器得到請求數據
Ajax
的過程只涉及JavaScript
、XMLHttpRequest
和DOM
。XMLHttpRequest
是aja
x的核心機制
// 1. 建立鏈接 var xhr = null; xhr = new XMLHttpRequest() // 2. 鏈接服務器 xhr.open('get', url, true) // 3. 發送請求 xhr.send(null); // 4. 接受請求 xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ success(xhr.responseText); } else { // fail fail && fail(xhr.status); } } }
ajax 有那些優缺點?
優勢:
Ajax
在客戶端運行,承擔了一部分原本由服務器承擔的工做,減小了大用戶量下的服務器負載。Ajax
能夠實現動態不刷新(局部刷新)缺點:
AJAX
暴露了與服務器交互的細節。jsonp
、 iframe
、window.name
、window.postMessage
、服務器上設置代理頁面
var module1 = (function(){ var _count = 0; var m1 = function(){ //... }; var m2 = function(){ //... }; return { m1 : m1, m2 : m2 }; })();
defer,只支持IE
async
:
建立script
,插入到DOM
中,加載完畢後callBack
內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在
setTimeout
的第一個參數使用字符串而非函數的話,會引起內存泄漏
閉包使用不當
數據體積方面
JSON
相對於XML
來說,數據的體積小,傳遞的速度更快些。數據交互方面
JSON
與JavaScript
的交互更加方便,更容易解析處理,更好的數據交互數據描述方面
JSON
對數據的描述性比XML
較差傳輸速度方面
JSON
的速度要遠遠快於XML
WebPack
是一個模塊打包工具,你可使用WebPack
管理你的模塊依賴,並編繹輸出模塊們所需的靜態文件。它可以很好地管理、打包Web
開發中所用到的HTML
、Javascript
、CSS
以及各類靜態文件(圖片、字體等),讓開發過程更加高效。對於不一樣類型的資源,webpack
有對應的模塊加載器。webpack
模塊打包器會分析模塊間的依賴關係,最後 生成了優化且合併後的靜態資源
CommonJS
是服務器端模塊的規範,Node.js
採用了這個規範。CommonJS
規範加載模塊是同步的,也就是說,只有加載完成,才能執行後面的操做。AMD
規範則是非同步加載模塊,容許指定回調函數
AMD
推薦的風格經過返回一個對象作爲模塊對象,CommonJS
的風格經過對module.exports
或exports
的屬性賦值來達到暴露模塊對象的目的
sql
注入原理
SQL
命令插入到Web
表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令總的來講有如下幾點
"-"
進行轉換等SQL
或者直接使用存儲過程進行數據查詢存取hash
掉密碼和敏感的信息XSS原理及防範
Xss(cross-site scripting)
攻擊指的是攻擊者往Web
頁面裏插入惡意html
標籤或者javascript
代碼。好比:攻擊者在論壇中放一個看似安全的連接,騙取用戶點擊後,竊取cookie
中的用戶私密信息;或者攻擊者在論壇中加一個惡意表單,當用戶提交表單的時候,卻把信息傳送到攻擊者的服務器中,而不是用戶本來覺得的信任站點
XSS防範方法
首先代碼裏對用戶輸入的地方和變量都須要仔細檢查長度和對」<」,」>」,」;」,」’」
等字符作過濾;其次任何內容寫到頁面以前都必須加以encode,避免不當心把html tag
弄出來。這一個層面作好,至少能夠堵住超過一半的XSS 攻擊
XSS與CSRF有什麼區別嗎?
XSS
是獲取信息,不須要提早知道其餘用戶頁面的代碼和數據包。CSRF
是代替用戶完成指定的動做,須要知道其餘用戶頁面的代碼和數據包。要完成一次CSRF
攻擊,受害者必須依次完成兩個步驟
登陸受信任網站A
,並在本地生成Cookie
在不登出A
的狀況下,訪問危險網站B
CSRF的防護
CSRF
方式方法不少樣,但總的思想都是一致的,就是在客戶端頁面增長僞隨機數工廠模式:
new
關鍵字構造函數模式
this
對象;同源策略指的是:協議,域名,端口相同,同源策略是一種安全協議
舉例說明:好比一個黑客程序,他利用Iframe
把真正的銀行登陸頁面嵌到他的頁面上,當你使用真實的用戶名,密碼登陸時,他的頁面就能夠經過Javascript
讀取到你的表單中input
中的內容,這樣用戶名,密碼就輕鬆到手了。
offsetWidth/offsetHeight
返回值包含content + padding + border,效果與e.getBoundingClientRect()相同
clientWidth/clientHeight
返回值只包含content + padding,若是有滾動條,也不包含滾動條
scrollWidth/scrollHeight
返回值包含content + padding + 溢出內容的尺寸