究竟什麼是閉包?閉包在什麼場景下使用?寫前端程序須要用到閉包嗎?我用jQuery也能寫的好好滴呀?閉包能夠解決哪些問題?使用閉包會帶來哪些好處?javascript
閉包是指能夠包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變量)。html
包含兩方面:要執行的代碼塊(因爲自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)和爲自由變量提供綁定的計算環境(做用域)前端
既然全部函數都是閉包,還有必要專門提這個概念嗎?大多數函數被調用時(invoked),使用的做用域和他們被定義時(defined)使用的做用域是同一個做用域,這種狀況下,閉包神馬的,可有可無。可是,當他們被invoked的時候,使用的做用域不一樣於他們定義時使用的做用域的時候,閉包就會變的很是有趣,而且開始有了不少的使用場景,這就是你之因此要掌握閉包的緣由。java
理解「閉包」:node
我將會將這張地圖分爲幾個你須要解決的問題,對於每一個問題,我將會:ios
問題:git
https://segmentfault.com/a/1190000002764479github
http://www.topfe.cn/javascript/395.htmlweb
函數節流:在頻繁觸發的狀況下,須要執行的邏輯只有執行完以後,才能繼續執行下一次。數據庫
函數防抖:在頻繁觸發的狀況下,只有足夠的空閒時間,才執行代碼一次,若是沒有執行完就清除掉,從新執行邏輯。
應用場景:高頻觸發如下方法
// 函數節流 var canRun = true; window.onscroll = function(){ if(!canRun){ // 判斷是否已空閒,若是在執行中,則直接return return; } canRun = false; setTimeout(function(){ console.log("函數節流"); canRun = true; }, 300); };
// 函數防抖 var timer = false; window.onscroll = function(){ clearTimeout(timer); // 清除未執行的代碼,重置回初始化狀態 timer = setTimeout(function(){ console.log("函數防抖"); }, 300); };
在諸多 Vue.js 應用中, Lodash, Moment, Axios, Async等都是一些很是有用的 JavaScript 庫. 但隨着項目愈來愈複雜, 可能會採起組件化和模塊化的方式來組織代碼, 還可能要使應用支持不一樣環境下的服務端渲染. 除非你找到了一個簡單而又健壯的方式來引入這些庫供不一樣的組件和模塊使用, 否則, 這些第三方庫的管理會給你帶來一些麻煩.
補充:ES6標準發佈後,module成爲標準,標準的使用是以export指令導出接口,以import引入模塊,可是在咱們一向的node模塊中,咱們採用的是CommonJS規範,使用require引入模塊,使用module.exports導出接口。在一個文件或模塊中,export、import能夠有多個,export default僅有一個。 require和import。
本文將介紹一些在 Vue.js 中使用第三方庫的方式:
結論:
爲了提高用戶體驗(User Experience,UX),咱們但願前端提供快速加載和執行的網頁。而對於提高開發者體驗(Developer Experience, DX)來講,咱們但願前端可以快速,簡便和實用。這樣的優化不只使咱們的用戶和開發者滿意,也會顯着提升SEO排名, 由於Google的SEO排名會偏向於優化較好的頁面。
優化瀏覽器前端的方法:首先,咱們不能控制瀏覽器或者改變它的行爲方式,可是咱們能夠理解它的工做原理,用來優化咱們頁面的加載。幸運的是,瀏覽器行爲的基本原理至關穩定並有據可查,長時間內也不會顯着改變;其次,代碼,堆棧,結構和模式是咱們能夠控制的。他們更靈活,改變地更快,爲咱們提供更多的選擇。
CSRF(Cross-site request forgery),它的中文名稱是跨站請求僞造,也被稱爲:one click attack/session riding,縮寫爲:CSRF/XSRF。
簡單地說,CSRF就是利用了咱們的登陸狀態或者受權狀態(請注意「利用」,並無竊取到),而後作一些損害咱們自身利益的事情。
從上面這個實例可知,完成CSRF攻擊流程:
總結:CSRF可以攻擊的根本緣由是:服務器沒法識別你的來源是否可靠。
那麼防護的方法有不少:
根據驗證是否可靠性思路,能夠有如下幾種方法:
跨站點腳本(Cross-site scripting,XSS)是一種容許攻擊者在另外一個用戶的瀏覽器中執行惡意腳本的腳本注入式攻擊。攻擊者並不直接鎖定受害者。而是利用一個受害者可能會訪問的存在漏洞的網站,經過這個網站間接把惡意代碼呈遞給受害者。對於受害者的瀏覽器而言,這些惡意代碼看上去就是網站正常的一部分,而網站也就無心中成了攻擊者的幫兇。
惡意代碼是如何注入的:對於攻擊者來講可以讓受害者瀏覽器執行惡意代碼的惟一方式,就是把代碼注入受害者從網站下載的頁面中。若是網站直接在頁面中呈現用戶輸入的內容的話,這種攻擊有可能得逞。由於攻擊者能夠以字符串的形式向頁面插入一段受害者瀏覽器可以執行的代碼。好比一段評論包含了"<script></script>",頁面加載就中招了。
什麼是惡意腳本:Javascript的執行環境受到嚴格限制並只有很是有限的權限訪問用戶的文件和操做系統,因此不算特別惡意。惡意的有Javascript有權訪問一些用戶的敏感信息,好比cookie;Javascript可以經過XMLHttpRequest或者其餘一些機制發送帶有任何內容的HTTP請求到任何地址;Javascript可以經過DOM操做方法對當前頁面的HTML作任意修改。
惡意腳本的後果:攻擊者有能力發動如下幾類攻擊,Cookie竊取;Cookie竊取;釣魚網站(Phishing)。
很是值得注意的重要一點是,惡意代碼只有在受害者的瀏覽器中最終獲得解析以後纔算得上是惡意,這隻可能發生有XSS缺陷的站點上。
攻擊是如何工做的:攻擊者利用提交網站表單將一段惡意文本插入網站的數據庫中;受害者向網站請求頁面;網站從數據庫中取出惡意文本把它包含進返回給受害者的頁面中;受害者的瀏覽器執行返回頁面中的惡意腳本,把本身的cookie發送給攻擊者的服務器。
XSS攻擊類型:雖然XSS攻擊的終極目標是在受害者的瀏覽器中執行惡意腳本,可是實現這個目標的不一樣途徑仍是有根本上的差異的。有持續型XSS攻擊:惡意文原本源於網站的數據庫;反射型XSS攻擊:惡意文原本源於受害者的請求;基於DOM的XSS攻擊:利用客戶端而不是服務端代碼漏洞發動攻擊。
阻止XSS攻擊的方式:編碼,也就是轉義用戶的輸入,這樣瀏覽器就會把它解讀爲數據而不是代碼;校驗,也就是對用戶的輸入進行過濾,這樣瀏覽器仍然把它解讀爲代碼但當中已不存在惡意指令了。