1.閉包
1.1 閉包簡單來說就是能夠讀取其他函數內部變量的函數
1.2 閉包是指有權訪問另一個函數作用域中變量的函數,創建閉包的最常見的方式就是在函數內創建另一個函數,通過另一個函數來訪問這個函數的局部變量,總的來說就是利用閉包可以突破作用鏈域
1.3 閉包優缺點:使用閉包是爲了設置私有的方法和變量,優點是可以避免全局變量的污染,缺點是會常駐內存,增大內存使用量,使用不當很容易造成內存泄漏。
1.4 在js中函數即閉包,只有函數纔會產生作用域的概念,閉包的最大用處一個是可以讀取函數內部變量,另一個就是這些變量始終保存在內存中,再一個就是封裝對象的私有屬性和私有方法。
閉包總結:閉包可以實現封裝和緩存,但是內存消耗太大,使用不當會造成內存溢出的問題
實例:
function fn(){
var a = 10; // fn的活動對象之中;
return function(){ //匿名函數的活動對象;
alert(a);
}
}
var b = fn();
b(); //10
2.作用域鏈、JavaScript、原型鏈
2.1 作用域鏈的作用是保證執行環境有訪問的變量和函數是有序的,
作用域鏈的變量只能向上訪問,且訪問到window對象時終止,向下訪問變量是不被允許的。
2.2 每一個對象呢都會在內部初始化一個屬性,就是prototype
(原型),當我們訪問一個對象的屬性時,如果這個對象內部不存在這個屬性,那麼就會去prototype
裏尋找,這個prototype
又有自己的prototype
,就這樣找下去,直到找到爲止或者window
終止。這也就是原型鏈的概念
2.3 原型與原型鏈的關係:instance.constructor.prototype=instance.__proto__
3.事件代理
3.1 事件代理,又被稱爲事件委託。是js中常用綁定事件的技巧。
3.2 事件代理:就是把原有需要的事件委託給父元素,讓父元素來監聽,事件代理的原理是DOM元素的事件冒泡。
3.3 使用事件代理的好處:可以提高性能,可以大量節省內存佔用,減少註冊事件,例如在ul
上代理所有li
的click
事件就非常方便
4.js的繼承
想要繼承就必須要提供一個父類,(繼承誰,提供繼承的屬性)
// 父類
function person(name){ //給構造函數添加參數
this.name=name;
this.sum=function(){
alert(this.name)
}
}
person.prototype.age=20 //給構造函數添加了原型屬性
4.1 構造繼承
// 借用構造函數繼承
function con(){
person.call(this,'jie'); //重點
this.age=18;
}
var cons=new con()
console.log(cons.name); //jie
console.log(cons.age); //18
console.log(cons instanceof person) //false
4.2 原型鏈繼承
// 原型鏈繼承
function son(){
this.name='jie'
}
son.prototype=new person() //主要
var son1=new son()
console.log(son1.age) //20
/* instanceof 判斷元素是否在另一個元素的原型鏈上
son1繼承了person的屬性,返回true*/
console.log(son1 instanceof person)
4.3 實例繼承
// 實例繼承
function Cat(name){
var ins=new person()
ins.name='tom'
return ins
}
var cat=new Cat()
console.log(cat.name) //tom
console.log(cat.age) //20
console.log(cat instanceof person) //true
console.log(cat instanceof Cat) //false
5.this的理解
this
總是指向函數的直接調用者(而非間接調用者);如果有new
關鍵字,this
指向new
出來的那個對象;在事件中,this
指向觸發這個事件的對象,特殊的是IE
中,attachEvent
中this
總指向全局對象window
6.事件模型
w3c中定義事件發生經歷的三個階段:捕獲階段,目標階段,冒泡階段
6.1 冒泡事件:當你使用事件冒泡時,子級元素先觸發,父級元素後觸發
阻止冒泡:在w3c
中,使用stopPropagation()
方法;但在IE中設置cancelBubble=true
6.2 捕獲事件:當你使用事件捕獲時,父級元素先觸發,子級元素後觸發
阻止捕獲:在w3c
中,使用preventDefault()
方法,在IE中設置window.event.returnValue=false
7.new操作符的理解
創建一個空對象,並且this
變量引用該對象,同時還繼承了該函數的原型;屬性和方法被加入到this
引用的對象中;新創建的對象由this
所引用,並且最後隱式返回this
8.Ajax原理
8.1 Ajax原理簡單來說就額是在用戶和服務器之間加了一箇中間層(AJAX引擎),通過XmlHttpRequest對象來向服務器發送異步請求,從服務器獲得數據,然後用JavaScript來操作DOM從而更新頁面;使用戶操作與服務器響應異步化。這其中最關鍵的一步就是從服務器獲得請求數據。
8.2 Ajax的過程只涉及JavaScript、XMLHttpRequest和DOM。XMLHttpRequest是Ajax的核心機構
var xhr = new XMLHttpRequest() //創建鏈接
xhr.open('get','sanji.php?p_id=0') //鏈接到服務器
xhr.send() //發送請求
xhr.onload = function () { //接受請求
var data = JSON.parse(xhr.responseText)
// console.log(data)
var options='<option value="">--請選擇--</option>'
// var options=''
for(var i=0;i<data.length;i++){
var option=`<option value="${data[i].id}">${data[i].title}</option>`
options+=option
}
document.querySelector('#province').innerHTML=options
}
8.3 Ajax優缺點 優點:通過異步模式,提升了用戶體驗,優化了瀏覽器與服務器之間的傳輸,減少了不必要的數據往返,減少寬帶佔用,ajax在客戶端運行,承擔了一部分本來由服務器承擔的工作,減少了大量用戶量的的服務器負載;ajax還可以實現動態不刷新(也就是局部刷新)
缺點:安全問題ajax暴露了與服務器交互的細節,對搜索引擎的支持較弱,不容易調試
9.解決跨域問題
在想解決跨域之前要先了解一下瀏覽器的同源政策。同源政策目的是爲了保證用戶信息的安全,防止惡意的網站竊取數據,那同源政策是什麼?所謂同源是指"協議+域名+端口"三者相同,如果有一個不相同則非同源
9.1 使用ajax的json
頁面
$(document).ready(function(){
var url='http://localhost:8080/WorkGroupManagment/open/getGroupById"
+"?id=1&callback=?';
$.ajax({
url:url,
dataType:'jsonp',
processData: false,
type:'get',
success:function(data){
alert(data.name);
},
error:function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}});
});
json格式
{
"message":"獲取成功",
"state":"1",
"result":{"name":"工作組1","id":1,"description":"11"}
}
9.2 nginx代理解決跨域
要配置nginx來代理頁面和後端的請求路徑
結尾:總的來說就是書寫一下加深自己的記憶,多看多寫總會理清的。讀書百遍其義自見,熟能生巧嘛