this:指向調用上下文javascript
閉包:內部函數能夠訪問它們所在的外部函數中聲明的全部局部變量、參數和聲明的其餘內部函數。當其中一個這樣的內部函數在包含它們的外部函數以外被調用時,就會造成閉包。css
閉包的好處:
(1)不增長額外的全局變量,
(2)執行過程當中全部變量都是在匿名函數內部。
閉包的缺點:html
(1)濫用閉包函數會形成內存泄露,由於閉包中引用到的包裹函數中定義的變量都永遠不會被釋放,內存消耗很大,因此不能濫用閉包,不然會形成網頁的性能問題,在IE中可能致使內存泄露。解決方法是,在必要的時候,及時釋放這個閉包函數,(在退出函數以前,將不使用的局部變量所有刪除。)前端
(2) 閉包會在父函數外部,改變父函數內部變量的值。因此,若是你把父函數看成對象(object)使用,把閉包看成它的公用方法(Public Method),把內部變量看成它的私有屬性(private value),這時必定要當心,不要隨便改變父函數內部變量的值。html5
做用域:做用域就是變量與函數的可訪問範圍,即做用域控制着變量與函數的可見性和生命週期。在JavaScript中,變量的做用域有全局做用域和局部做用域兩種。java
全局做用域:在代碼中任何地方都能訪問到的對象擁有全局做用域node
(1)最外層函數和在最外層函數外面定義的變量擁有全局做用域jquery
(2)全部末定義直接賦值的變量自動聲明爲擁有全局做用域webpack
(3)全部window對象的屬性擁有全局做用域web
和全局做用域相反,局部做用域通常只在固定的代碼片斷內可訪問到,最多見的例如函數內部,全部在一些地方也會看到有人把這種做用域稱爲函數做用域,
2. Javascript做用域鏈?
理解變量和函數的訪問範圍和生命週期,全局做用域與局部做用域的區別,JavaScript中沒有塊做用域,函數的嵌套造成不一樣層次的做用域,嵌套的層次造成鏈式形式,經過做用域鏈查找屬性的規則須要深刻理解。
"鏈式做用域"結構(chain scope),子對象會一級一級地向上尋找全部父對象的變量。因此,父對象的全部變量,對子對象都是可見的,反之則不成立。
* 原型對象也是普通的對象,是對象一個自帶隱式的 __proto__ 屬性,原型也有可能有本身的原型,若是一個原型對象的原型不爲null的話,咱們就稱之爲原型鏈。
* 原型鏈是由一些用來繼承和共享屬性的對象組成的(有限的)對象鏈。
* JavaScript的數據對象有那些屬性值?
writable:這個屬性的值是否能夠改。
configurable:這個屬性的配置是否能夠刪除,修改。
enumerable:這個屬性是否能在for…in循環中遍歷出來或在Object.keys中列舉出來。
value:屬性值。
* 當咱們須要一個屬性的時,Javascript引擎會先看當前對象中是否有這個屬性, 若是沒有的話,就會查找他的Prototype對象是否有這個屬性。
function clone(proto) {
function Dummy() { }
Dummy.prototype = proto;
Dummy.prototype.constructor = Dummy;
return new Dummy(); //等價於Object.create(Person);
}
function object(old) {
function F() {};
F.prototype = old;
return new F();
}
var newObj = object(oldObject);
考點:繼承的多種方式
function b(){}
b.protoototype=new a;
符合W3C標準的事件綁定addEventLisntener /attachEvent
讓利用事件冒泡的原理,讓本身的所觸發的事件,讓他的父元素代替執行!
Javascript的事件流模型都有什麼?
「事件冒泡」:事件開始由最具體的元素接受,而後逐級向上傳播
「事件捕捉」:事件由最不具體的節點先接收,而後逐級向下,一直到最具體的
「DOM事件流」:三個階段:事件捕捉,目標階段,事件冒泡
|
//大牛作法; //思路:先將字符串轉換爲數組 split(),利用數組的反序函數 reverse()顛倒數組,再利用 jion() 轉換爲字符串 var str = '12345678'; str = str.split('').reverse().join(''); |
本地對象爲array obj regexp等能夠new實例化
內置對象爲gload Math 等不能夠實例化的
宿主爲瀏覽器自帶的document,window 等
5.不一樣瀏覽器的兼容前綴?
-ms-transform:rotate(30deg); /* IE 9 */
-moz-transform:rotate(30deg); /* Firefox */
-webkit-transform:rotate(30deg); /* Safari and Chrome */
-o-transform:rotate(30deg); /* Opera */
*jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。
*jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。
提供了一些經常使用的界面元素,諸如對話框、拖動行爲、改變大小行爲等等
a、優先使用ID選擇器
b、jquery獲取到的DOM元素若是須要屢次使用,建議使用一個變量將其保存起來,由於操做DOM的過程是很是耗費性能的
c、在class前使用tag(標籤名)
d、給選擇器一個上下文
e、慎用 .live()方法(應該說盡可能不要使用)
f、使用data()方法存儲臨時變量
思路:先解釋異步,再解釋ajax如何使用
Ajax的原理簡單來講經過XmlHttpRequest對象來向服務器發異步請求,從服務器得到數據,而後用javascript來操做DOM而更新頁面。這其中最關鍵的一步就是從服務器得到請求數據。要清楚這個過程和原理,咱們必須對 XMLHttpRequest有所瞭解。
啊
type
類型:String
默認值: "GET")。請求方式 ("POST" 或 "GET"), 默認爲 "GET"。注意:其它 HTTP 請求方法,如 PUT 和 DELETE 也可使用,但僅部分瀏覽器支持。
url
類型:String
默認值: 當前頁地址。發送請求的地址。
success
類型:Function
請求成功後的回調函數。
參數:由服務器返回,並根據 dataType 參數進行處理後的數據;描述狀態的字符串。
這是一個 Ajax 事件。
options
類型:Object
可選。AJAX 請求設置。全部選項都是可選的。
async
類型:Boolean
默認值: true。默認設置下,全部請求均爲異步請求。若是須要發送同步請求,請將此選項設置爲 false。
注意,同步請求將鎖住瀏覽器,用戶其它操做必須等待請求完成才能夠執行。
beforeSend(XHR)
類型:Function
發送請求前可修改 XMLHttpRequest 對象的函數,如添加自定義 HTTP 頭。
XMLHttpRequest 對象是惟一的參數。
這是一個 Ajax 事件。若是返回 false 能夠取消本次 ajax 請求。
cache
類型:Boolean
默認值: true,dataType 爲 script 和 jsonp 時默認爲 false。設置爲 false 將不緩存此頁面。
jQuery 1.2 新功能。
contentType
類型:String
默認值: "application/x-www-form-urlencoded"。發送信息至服務器時內容編碼類型。
默認值適合大多數狀況。若是你明確地傳遞了一個 content-type 給 $.ajax() 那麼它一定會發送給服務器(即便沒有數據要發送)。
data
類型:String
發送到服務器的數據。將自動轉換爲請求字符串格式。GET 請求中將附加在 URL 後。查看 processData 選項說明以禁止此自動轉換。必須爲 Key/Value 格式。若是爲數組,jQuery 將自動爲不一樣值對應同一個名稱。如 {foo:["bar1", "bar2"]} 轉換爲 '&foo=bar1&foo=bar2'。
dataFilter
類型:Function
給 Ajax 返回的原始數據的進行預處理的函數。提供 data 和 type 兩個參數:data 是 Ajax 返回的原始數據,type 是調用 jQuery.ajax 時提供的 dataType 參數。函數返回的值將由 jQuery 進一步處理。
dataType
類型:String
預期服務器返回的數據類型。若是不指定,jQuery 將自動根據 HTTP 包 MIME 信息來智能判斷,好比 XML MIME 類型就被識別爲 XML。在 1.4 中,JSON 就會生成一個 JavaScript 對象,而 script 則會執行這個腳本。隨後服務器端返回的數據會根據這個值解析後,傳遞給回調函數。可用值:
error
類型:Function
默認值: 自動判斷 (xml 或 html)。請求失敗時調用此函數。
有如下三個參數:XMLHttpRequest 對象、錯誤信息、(可選)捕獲的異常對象。
若是發生了錯誤,錯誤信息(第二個參數)除了獲得 null 以外,還多是 "timeout", "error", "notmodified" 和 "parsererror"。
這是一個 Ajax 事件。
$.ajax({
url:"1.html",
data:{name:"張三",age:18},//post數據
dataType:"json",
type:"POST",
success:function(data){
//data:返回的數據
},
error:function(){
//異常處理
}
});
1. 建立XMLHttpRequest對象,也就是建立一個異步調用對象
2. 建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息
3. 設置響應HTTP請求狀態變化的函數
4. 發送HTTP請求
5. 獲取異步調用返回的數據
6. 使用JavaScript和DOM實現局部刷新
JSONP的最基本的原理是:動態添加一個<script>標籤,而script標籤的src屬性是沒有跨域的限制的。這樣說來,這種跨域方式其實與ajax XmlHttpRequest協議無關了。
動態建立script標籤,回調函數
Ajax是頁面無刷新請求數據操做
Ajax是全稱是asynchronous JavaScript andXML,即異步JavaScript和xml,用於在Web頁面中實現異步數據交互,實現頁面局部刷新。
優勢:可使得頁面不重載所有內容的狀況下加載局部內容,下降數據傳輸量,避免用戶不斷刷新或者跳轉頁面,提升用戶體驗
缺點:對搜索引擎不友好;要實現ajax下的先後退功能成本較大;可能形成請求數的增長跨域問題限制;
JSON是一種輕量級的數據交換格式,ECMA的一個子集
優勢:輕量級、易於人的閱讀和編寫,便於機器(JavaScript)解析,支持複合數據類型(數組、對象、字符串、數字)
get通常用來進行查詢操做,url地址有長度限制,請求的參數都暴露在url地址當中,若是傳遞中文參數,須要本身進行編碼操做,安全性較低。
post請求方式主要用來提交數據,沒有數據長度的限制,提交的數據內容存在於http請求體中,數據不會暴漏在url地址中。
get傳送的數據長度有限制,post沒有
get經過url傳遞,在瀏覽器地址欄可見,post是在報文中傳遞
適用場景:
post通常用於表單提交
get通常用於簡單的數據查詢,嚴格要求不是那麼高的場景
CSS的盒子模型有兩種:IE盒子模型、標準的W3C盒子模型模型
盒模型:內容、內邊距、外邊距(通常不計入盒子實際寬度)、邊框
因爲瀏覽器兼容的問題,不一樣的瀏覽器對標籤的默認樣式值不一樣,若不初始化會形成不一樣瀏覽器之間的顯示差別
可是初始化CSS會對搜索引擎優化形成小影響
1. CSS3實現圓角(border-radius),陰影(box-shadow),
2. 對文字加特效(text-shadow、),線性漸變(gradient),旋轉(transform)
3.transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);// 旋轉,縮放,定位,傾斜
4. 增長了更多的CSS選擇器 多背景 rgba
5. 在CSS3中惟一引入的僞元素是 ::selection.
6. 媒體查詢,多欄佈局
7. border-image
新特性:
1. 拖拽釋放(Drag and drop) API
2. 語義化更好的內容標籤(header,nav,footer,aside,article,section)
3. 音頻、視頻API(audio,video)
4. 畫布(Canvas) API
5. 地理(Geolocation) API
6. 本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉後數據不丟失;
7. sessionStorage 的數據在瀏覽器關閉後自動刪除
8. 表單控件,calendar、date、time、email、url、search
9. 新的技術webworker, websocket, Geolocation
移除的元素:
1. 純表現的元素:basefont,big,center,font, s,strike,tt,u;
2. 對可用性產生負面影響的元素:frame,frameset,noframes;
支持HTML5新標籤:
1. IE8/IE7/IE6支持經過 document.createElement 方法產生的標籤,能夠利用這一特性讓這些瀏覽器支持 HTML5 新標籤,瀏覽器支持新標籤後,還須要添加標籤默認的樣式(固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架):
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
如何區分:
DOCTYPE聲明新增的結構元素、功能元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// 方法一:已知元素的高寬 #div1{ background-color:#6699FF; width:200px; height:200px; position: absolute; //父元素須要相對定位 top: 50%; left: 50%; margin-top:-100px ; //二分之一的height,width margin-left: -100px; }
//方法二:未知元素的高寬
#div1{ width: 200px; height: 200px; background-color: #6699FF;
margin:auto; position: absolute; //父元素須要相對定位 left: 0; top: 0; right: 0; bottom: 0; } |
那麼問題來了,如何垂直居中一個<img>?(用更簡便的方法。)
1 2 3 4 5 6 |
#container //<img>的容器設置以下 { display:table-cell; text-align:center; vertical-align:middle; } |
<!DOCTYPE>用於告知瀏覽器該以何種模式來渲染文檔
嚴格模式下:頁面排版及JS解析是以該瀏覽器支持的最高標準來執行
混雜模式:不嚴格按照標準執行,主要用來兼容舊的瀏覽器,向後兼容
答:塊級元素:div p h1 h2 h3 h4 form ul
行內元素: a b br i span input select
Css盒模型:內容,border ,margin,padding
Cookies:服務器和客戶端均可以訪問;大小隻有4KB左右;有有效期,過時後將會刪除;
本地存儲:只有本地瀏覽器端可訪問數據,服務器不能訪問本地存儲直到故意經過POST或者GET的通道發送到服務器;每一個域5MB;沒有過時數據,它將保留知道用戶從瀏覽器清除或者使用Javascript代碼移除
參考資料:J:\代碼,PPT,筆記,電子書\面試題\雅虎14條優化規則.docx
(1) 減小http請求次數:CSS Sprites, JS、CSS源碼壓縮、圖片大小控制合適;網頁Gzip,CDN託管,data緩存 ,圖片服務器。
(2) 前端模板 JS+數據,減小因爲HTML標籤致使的帶寬浪費,前端用變量保存AJAX請求結果,每次操做本地變量,不用請求,減小請求次數
(3) 用innerHTML代替DOM操做,減小DOM操做次數,優化javascript性能。
(4) 當須要設置的樣式不少時設置className而不是直接操做style。
(5) 少用全局變量、緩存DOM節點查找的結果。減小IO讀取操做。
(6) 避免使用CSS Expression(css表達式)又稱Dynamic properties(動態屬性)。
(7) 圖片預加載,將樣式表放在頂部,將腳本放在底部 加上時間戳。
(8) 避免在頁面的主體佈局中使用table,table要等其中的內容徹底下載以後纔會顯示出來,顯示比div+css佈局慢。
壓縮、合併,減小請求,代碼層析優化。。。
1.減小css,js文件數量及大小(減小重複性代碼,代碼重複利用),壓縮CSS和Js代碼
2.圖片的大小
3.把css樣式表放置頂部,把js放置頁面底部
4.減小http請求數
5.使用外部 Js 和 CSS
文件合併
文件最小化/文件壓縮
使用CDN託管
緩存的使用
6.清除浮動?
二、clear:both清除浮動: 在父級「</div>」結束前加此div引入「class="clear"」樣式。這樣便可清除浮動。方便適用,但會多加CSS和HTML標籤。clear{clear:both
}
<div class="divcss5">
<div class="divcss5-left">left浮動</div>
<div class="divcss5-right">right浮動</div>
<div class="clear"></div>
</div>
三、父級div定義 overflow:hidden
對父級CSS選擇器加overflow:hidden樣式,能夠清除父級內使用float產生浮動。優勢是能夠不多CSS代碼便可解決浮動產生。
四、 //一種常見利用僞類清除浮動的代碼
.clearfix:after {
content:"."; //這裏利用到了content屬性
display:block;
height:0;
visibility:hidden;
clear:both; }
.clearfix {
*zoom:1;
}
五、父級div定義overflow:auto
六、父級div也一塊兒浮動
七、父級div定義display:table
8、結尾處加br標籤clear:both
11、前端歸納性問題
使用率較高的框架有jQuery、YUI、Prototype、Dojo、Ext.js、Mootools等。尤爲是jQuery,超過91%。
輕量級框架有Modernizr、underscore.js、backbone.js、Raphael.js等。(理解這些框架的功能、性能、設計原理)
前端開發工具:Sublime Text 、Eclipse、Notepad、Firebug、HttpWatch、Yslow。
開發過的插件:城市選擇插件,汽車型號選擇插件、幻燈片插件。彈出層。(寫過開源程序,加載器,js引擎更好)
優勢:
1. 由於Node是基於事件驅動和無阻塞的,因此很是適合處理併發請求,所以構建在Node上的代理服務器相比其餘技術實現(如Ruby)的服務器表現要好得多。
2. 與Node代理服務器交互的客戶端代碼是由javascript語言編寫的,所以客戶端和服務器端都用同一種語言編寫,這是很是美妙的事情。
缺點:
1. Node是一個相對新的開源項目,因此不太穩定,它老是一直在變。
2. 缺乏足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子(第三方庫如今已經很豐富了,因此這個缺點能夠說不存在了)。
1.Javascript
今天讓咱們站在語言的高度來看一下Javascript都有點什麼。由於是全局性的俯瞰,因此不針對細節做詳細的講解。
先來看一張圖吧:
解釋一下:
核心(ECMAScript):定義了腳本語言的全部對象,屬性和方法。文檔對象模型(DOM):HTML和XML應用程序接口。瀏覽器對象模型(BOM):對瀏覽器窗口進行訪問操做
如今來具體的講一個各個成分:
關於ECMAScript
ECMAScript的工做是定義語法和對象,從最基本的數據類型、條件語句、關鍵字、保留字到 異常處理和對象定義都是它的範疇。在ECMAScript範疇內定義的對象也叫作原生對象。其實上它就是一套定義了語法規則的接口,而後由不一樣的瀏覽器對 其進行實現,最後咱們輸寫遵照語法規則的程序,完成應用開發需求。
關於DOM
根據DOM的定義(HTML和XML應用程序接口)可知DOM由兩個部分組成,針對於XML的DOM即DOM Core和針對HTML的DOM HTML。那DOM Core 和DOM HTML有什麼區別與聯繫呢?DOM Core的核心概念就是節點(Node)。DOM會將文檔中不一樣類型的元素(這裏不元素並不特指<div>這種tag,還包括屬性,註釋,文本之類)都看做爲不一樣的節點。
上圖描述了DOM CORE的結構圖,比較專業,來看一個簡單的:
view sourceprint?
1 <div id="container">
2 <span>hello world</span>
3 </div>
來看一下這段代碼在標準瀏覽器裏的DOM表現:
div和span元素被展示成了一個元素節點,對應到節點結構圖中的Element元素。"hello world"和div與span之間的間隔,被展示成了文本節點,對應到節點結構圖中的CharacterDate元素。DOM CORE在解析文檔時,會將全部的元素、屬性、文本、註釋等等視爲一個節點對象(或繼承自節點對象的對象,多態、向上轉型),根據文本結構依次展示,最後行成了一棵"DOM樹"。
DOM HTML的核心概念是HTMLElement,DOM HTML會將文檔中的元素(這裏的元素特指<body>這種tag,不包括註釋,屬性,文本)都視爲HTMLElement。而元素的屬性,則爲HTMLElement的屬性。
再來看一個示例:
從Node接口提供的屬性,myElement.attributes["id"].value;很明顯myElement.attributes["id"]返回一個對象.value是獲得對象的value屬性。Element實現的方法返回 myElement.getAttributes("id");很明顯此時id如今只是一個屬性而已,這只是一個獲得屬性的操做。
其實上DOM Core和DOM html的外部調用接口相差並非很大,對於html文檔能夠用DOM html進行操做,針對xhtml能夠用DOM Core。
關於BOM
老規則,先來一張圖:
BOM與瀏覽器緊密結合,這些對象也被稱爲是宿主對象,即由環境提供的對象。這裏要強調一個奇怪 的對象Global對象,它表明一個全局對象,Javascript是不容許存在獨立的函數,變量和常量,若是沒有額外的定義,他們都做爲Global對 象的屬性或方法來看待.像parseInt(),isNaN(),isFinite()等等都做爲Global對象的方法來看待,像 Nan,Infinity等"常量"也是Global對象的屬性。像Boolean,String,Number,RegExp等內置的全局對象的構造函 數也是Global對象的屬性.可是Global對象實際上並不存在,也就是說你用Global.NaN訪問NaN將會報錯。實際上它是由window來 充當這個角色,而且這個過程是在javascript首次加載時進行的。
理解模塊化開發模式:瀏覽器端requirejs,seajs;服務器端nodejs;ES6模塊化;fis、webpack等前端總體模塊化解決方案;grunt、gulp等前端工做流的使用