1. 程式人生 > >Javascript常見技術點

Javascript常見技術點

    前臺技術容易上手,掌握主要賬務一些細碎的技術點會給開發帶來更大的便利。本文章持續更新,用於記錄常見的javascript技術點。

1、javascript面向物件中繼承實現

javascript面向物件中的繼承實現一般都使用到了建構函式和Prototype原型鏈,簡單的程式碼如下: 
	function Animal(name) {
		this.name = name;
	}
	Animal.prototype.getName = function() {
		alert(this.name)
	}

	function Dog() {};
	Dog.prototype = new Animal("Buddy");
	Dog.prototype.constructor = Dog;
	var dog = new Dog();

2、寫出3個使用this的典型應用

(1)在html元素事件屬性中使用,如 

<input type=”button” onclick=”showInfo(this);” value=”點選一下”/>

(2)建構函式 

function Animal(name, color) {
   this.name = name;
   this.color = color;
}

(3) 

<input type="button" id="text" value="點選一下" />
<script type="text/javascript">
var btn = document.getElementById("text");
btn.onclick = function() {
alert(this.value); //此處的this是按鈕元素
}
</script>

(4)CSS expression表示式中使用this關鍵字 

<table width="100px" height="100px">
  <tr>
    <td>
    <div style="width:expression(this.parentNode.width);">div element</div>
    </td>
  </tr>
</table>

3、JavaScript中如何對一個物件進行深度clone

function cloneObject(o) {
	if (!o || 'object' !== typeof o) {
		return o;
	}
	var c = 'function' === typeof o.pop ? [] : {};
	var p, v;
	for (p in o) {
		if (o.hasOwnProperty(p)) {
			v = o[p];
			if (v && 'object' === typeof v) {
				c[p] = Ext.ux.clone(v);
			} else {
				c[p] = v;
			}
		}
	}
	return c;
};

4、ajax是什麼? ajax的互動模型? 同步和非同步的區別? 如何解決跨域問題?

Ajax是多種技術組合起來的一種瀏覽器和伺服器互動技術,基本思想是允許一個網際網路瀏覽器向一個遠端頁面/服務做非同步的http呼叫,並且用收到的資料來更新一個當前web頁面而不必重新整理整個頁面。該技術能夠改進客戶端的體驗。包含的技術: 
XHTML:對應W3C的XHTML規範,目前是XHTML1.0。 
CSS:對應W3C的CSS規範,目前是CSS2.0 
DOM:這裡的DOM主要是指HTML DOM,XML DOM包括在下面的XML中 
JavaScript:對應於ECMA的ECMAScript規範 
XML:對應W3C的XML DOM、XSLT、XPath等等規範 
XMLHttpRequest:對應WhatWG的Web Applications1.0規範(http://whatwg.org/specs/web-apps/current-work/) 

AJAX互動模型 
同步:指令碼會停留並等待伺服器傳送回覆然後再繼續 
非同步:指令碼允許頁面繼續其程序並處理可能的回覆 

跨域問題簡單的理解就是因為JS同源策略的限制,a.com域名下的JS無法操作b.com或c.a.com下的物件,具體場景如下: 
PS:(1)如果是埠或者協議造成的跨域問題前端是無能為力的 

(2) 在跨域問題上,域僅僅通過URL的首部來識別而不會嘗試判斷相同的IP地址對應的域或者兩個域是否對應一個IP 
前端對於跨域的解決辦法: 
(1) document.domain+iframe 
(2) 動態建立script標籤 

5、什麼是閉包?下面這個ul,如何點選每一列的時候alert其index?

<ul id=”test”>
<li>這是第一條</li>
<li>這是第二條</li>
<li>這是第三條</li>
</ul>

內部函式被定義它的函式的外部區域呼叫的時候就產生了閉包。 
(function A() {
   var index = 0;
   var ul = document.getElementById("test");
   var obj = {};
   for (var i = 0, l = ul.childNodes.length; i < l; i++) {
      if (ul.childNodes[i].nodeName.toLowerCase() == "li") {
         var li = ul.childNodes[i];
         li.onclick = function() {
            index++;
            alert(index);
         }
      }
   }
})();

6、請給出非同步載入js方案,不少於兩種

預設情況javascript是同步載入的,也就是javascript的載入時阻塞的,後面的元素要等待javascript載入完畢後才能進行再載入,對於一些意義不是很大的javascript,如果放在頁頭會導致載入很慢的話,是會嚴重影響使用者體驗的。 
非同步載入方式: 
(1) defer,只支援IE 
(2) async: 
(3) 建立script,插入到DOM中,載入完畢後callBack,見程式碼: 
function loadScript(url, callback) {
	var script = document.createElement("script")
	script.type = "text/javascript";
	if (script.readyState) { //IE
		script.onreadystatechange = function() {
			if (script.readyState == "loaded" ||
				script.readyState == "complete") {
				script.onreadystatechange = null;
				callback();
			}
		};
	} else { //Others: Firefox, Safari, Chrome, and Opera
		script.onload = function() {
			callback();
		};
	}
	script.src = url;
	document.body.appendChild(script);
}

7、請設計一套方案,用於確保頁面中JS載入完全。

var n = document.createElement("script");
n.type = "text/javascript";
//以上省略部分程式碼
//ie支援script的readystatechange屬性(IE support the readystatechange event for script and css nodes)
if (ua.ie) {
	n.onreadystatechange = function() {
		var rs = this.readyState;
		if ('loaded' === rs || 'complete' === rs) {
			n.onreadystatechange = null;
			f(id, url); //回撥函式
		}
	};
	//省略部分程式碼
	//safari 3.x supports the load event for script nodes(DOM2)
	n.addEventListener('load', function() {
		f(id, url);
	});
	//firefox and opera support onload(but not dom2 in ff) handlers for
	//script nodes. opera, but no ff, support the onload event for link
	//nodes.
} else {
	n.onload = function() {
		f(id, url);
	};
}

8、js中如何定義class,如何擴充套件prototype?

Ele.className = “***”; //***在css中定義,形式如下:.*** {…} 
A.prototype.B = C; 
A是某個建構函式的名字 
B是這個建構函式的屬性 
C是想要定義的屬性的值 

9、documen.write和 innerHTML的區別

document.write只能重繪整個頁面 
innerHTML可以重繪頁面的一部分 

10、前端開發的優化問題

(1) 減少http請求次數:css spirit,data uri 
(2) JS,CSS原始碼壓縮 
(3) 前端模板 JS+資料,減少由於HTML標籤導致的頻寬浪費,前端用變數儲存AJAX請求結果,每次操作本地變數,不用請求,減少請求次數 
(4) 用innerHTML代替DOM操作,減少DOM操作次數,優化javascript效能 
(5) 用setTimeout來避免頁面失去響應 
(6) 用hash-table來優化查詢 
(7) 當需要設定的樣式很多時設定className而不是直接操作style 
(8) 少用全域性變數 
(9) 快取DOM節點查詢的結果 
(10) 避免使用CSS Expression 
(11) 圖片預載 
(12) 避免在頁面的主體佈局中使用table,table要等其中的內容完全下載之後才會顯示出來,顯示比div+css佈局慢