面向?qū)ο?/h4>
- 備份指針
// this在事件指令中指向事件源
// that稱為備份指針
var that = this;
面向?qū)ο笕筇匦?/h5>
封裝
繼承
多態(tài)
面向?qū)ο蟮氖褂?/h4>
- 容錯(cuò)處理
var option = option || {};
閉包
- 當(dāng)一個(gè)內(nèi)部函數(shù)被其外部函數(shù)之外的變量引用時(shí),就形成了一個(gè)閉包。
function A(){
function B(){
console.log("Hello XMG!");
}
return B;
}
var b = A();
b();//Hello XMG!
技法最大目的: 全局變量私有化
閉包的最大用處有兩個(gè):
可以讀取函數(shù)內(nèi)部的變量
讓這些變量的值始終保持在內(nèi)存中。
所有的全局變量都是Windows屬性. 所以可以文件各個(gè)地方拿到
!!!在函數(shù)內(nèi)部的變量前面沒(méi)有var用來(lái)聲明就代表是全局變量
函數(shù)嵌套的變量取值采用就近原則 :
變量的查找過(guò)程(查找過(guò)程只能從內(nèi)部向外)
先在現(xiàn)作用域中查找(遍歷)
去父級(jí)-> 祖父級(jí)作用域查找
直到找到全局變量(Window屬性)后還木有找到就報(bào)錯(cuò)
缺點(diǎn): 類似于遞歸, 浪費(fèi)性能. 所以建議盡量不要使用全局變量
引入閉包 : 用于保存局部變量. 但是不能亂用, 過(guò)多容易導(dǎo)致內(nèi)存泄漏.
閉包的技術(shù)優(yōu)點(diǎn):
不污染全局空間!
內(nèi)部所有的臨時(shí)變量執(zhí)行完畢都會(huì)釋放不占內(nèi)存。
可以保存全局?jǐn)?shù)據(jù)。
更新復(fù)雜變量。
閉包寫法
(function(){})();
;(function(){})(); //標(biāo)準(zhǔn)寫法
+(function(){})();
-(function(){})();
?(function(){})();
itin 快捷鍵 for in循環(huán)
作用域鏈條
封閉作用域
- 目的 : 全局變量私有化
高級(jí)排他--- 閉包寫法
// 記錄選中的元素
var seleNode = null;
for(var i = 0; i<list.length; i++){
var li = list[i];
if(i == 0){
seleNode = li;
}
li.onmouseover = function () {
// 排他
// 清空上一次的選中
seleNode.className = '';
// 2.設(shè)置當(dāng)前
this.className = 'current';
// 3.記錄當(dāng)前選中
seleNode = this;
}
}
})(document,window);
高級(jí)函數(shù)節(jié)流
低級(jí): 定時(shí)器(降低某個(gè)函數(shù)調(diào)用的頻率)
使用了閉包, 具有擴(kuò)展性
閉包傳參. 封裝后可以直接調(diào)用.
function fn(callback,del) {
var timer = null;
//降低這個(gè)函數(shù)調(diào)用的頻率(使用了閉包).
return function () {
clearTimeout(timer);
timer = setTimeout(function () {
if(callback) callback();
},del);
}
}
//只要onresize或者onscroll時(shí)調(diào)用即可.
window.onresize = fn(function () {
console.log(1);
},200);
window.onscroll = fn(function () {
console.log(2);
},300);
閉包傳參
- 實(shí)現(xiàn)功能, 點(diǎn)擊圖片使其每次移動(dòng)5px
var imgs = document.getElementsByTagName('img');
imgs[0].onclick = fn(-5);
function fn(speed) {
var num = 0;
return function () {
num += speed;
this.style.left = num + 'px';
}
}
imgs[1].onclick = fn(5);
構(gòu)造函數(shù)
所有的構(gòu)造函數(shù)有一個(gè)特點(diǎn):首字母大寫
在js中我們可以理解為只要執(zhí)行以后能夠返回新的對(duì)象的函數(shù)就是構(gòu)造函數(shù)
構(gòu)造函數(shù)技巧的最大目的:創(chuàng)造完全獨(dú)立的對(duì)象,互相之間不影響
關(guān)鍵詞new
將一個(gè)函數(shù)變成對(duì)象并返回, 在這個(gè)函數(shù)的內(nèi)部將this指向函數(shù)本身
只有在和構(gòu)造函數(shù)配合的時(shí)候才有用
相當(dāng)于可以化簡(jiǎn)構(gòu)造函數(shù)自己創(chuàng)造對(duì)象和返回對(duì)象的步驟。
原型屬性prototype
- 有能力給對(duì)象添加屬性和方法
- 不太明白用法...
// this在事件指令中指向事件源
// that稱為備份指針
var that = this;
封裝
繼承
多態(tài)
面向?qū)ο蟮氖褂?/h4>
- 容錯(cuò)處理
var option = option || {};
閉包
- 當(dāng)一個(gè)內(nèi)部函數(shù)被其外部函數(shù)之外的變量引用時(shí),就形成了一個(gè)閉包。
function A(){
function B(){
console.log("Hello XMG!");
}
return B;
}
var b = A();
b();//Hello XMG!
技法最大目的: 全局變量私有化
閉包的最大用處有兩個(gè):
可以讀取函數(shù)內(nèi)部的變量
讓這些變量的值始終保持在內(nèi)存中。
所有的全局變量都是Windows屬性. 所以可以文件各個(gè)地方拿到
!!!在函數(shù)內(nèi)部的變量前面沒(méi)有var用來(lái)聲明就代表是全局變量
函數(shù)嵌套的變量取值采用就近原則 :
變量的查找過(guò)程(查找過(guò)程只能從內(nèi)部向外)
先在現(xiàn)作用域中查找(遍歷)
去父級(jí)-> 祖父級(jí)作用域查找
直到找到全局變量(Window屬性)后還木有找到就報(bào)錯(cuò)
缺點(diǎn): 類似于遞歸, 浪費(fèi)性能. 所以建議盡量不要使用全局變量
引入閉包 : 用于保存局部變量. 但是不能亂用, 過(guò)多容易導(dǎo)致內(nèi)存泄漏.
閉包的技術(shù)優(yōu)點(diǎn):
不污染全局空間!
內(nèi)部所有的臨時(shí)變量執(zhí)行完畢都會(huì)釋放不占內(nèi)存。
可以保存全局?jǐn)?shù)據(jù)。
更新復(fù)雜變量。
閉包寫法
(function(){})();
;(function(){})(); //標(biāo)準(zhǔn)寫法
+(function(){})();
-(function(){})();
?(function(){})();
itin 快捷鍵 for in循環(huán)
作用域鏈條
封閉作用域
- 目的 : 全局變量私有化
高級(jí)排他--- 閉包寫法
// 記錄選中的元素
var seleNode = null;
for(var i = 0; i<list.length; i++){
var li = list[i];
if(i == 0){
seleNode = li;
}
li.onmouseover = function () {
// 排他
// 清空上一次的選中
seleNode.className = '';
// 2.設(shè)置當(dāng)前
this.className = 'current';
// 3.記錄當(dāng)前選中
seleNode = this;
}
}
})(document,window);
高級(jí)函數(shù)節(jié)流
低級(jí): 定時(shí)器(降低某個(gè)函數(shù)調(diào)用的頻率)
使用了閉包, 具有擴(kuò)展性
閉包傳參. 封裝后可以直接調(diào)用.
function fn(callback,del) {
var timer = null;
//降低這個(gè)函數(shù)調(diào)用的頻率(使用了閉包).
return function () {
clearTimeout(timer);
timer = setTimeout(function () {
if(callback) callback();
},del);
}
}
//只要onresize或者onscroll時(shí)調(diào)用即可.
window.onresize = fn(function () {
console.log(1);
},200);
window.onscroll = fn(function () {
console.log(2);
},300);
閉包傳參
- 實(shí)現(xiàn)功能, 點(diǎn)擊圖片使其每次移動(dòng)5px
var imgs = document.getElementsByTagName('img');
imgs[0].onclick = fn(-5);
function fn(speed) {
var num = 0;
return function () {
num += speed;
this.style.left = num + 'px';
}
}
imgs[1].onclick = fn(5);
構(gòu)造函數(shù)
所有的構(gòu)造函數(shù)有一個(gè)特點(diǎn):首字母大寫
在js中我們可以理解為只要執(zhí)行以后能夠返回新的對(duì)象的函數(shù)就是構(gòu)造函數(shù)
構(gòu)造函數(shù)技巧的最大目的:創(chuàng)造完全獨(dú)立的對(duì)象,互相之間不影響
關(guān)鍵詞new
將一個(gè)函數(shù)變成對(duì)象并返回, 在這個(gè)函數(shù)的內(nèi)部將this指向函數(shù)本身
只有在和構(gòu)造函數(shù)配合的時(shí)候才有用
相當(dāng)于可以化簡(jiǎn)構(gòu)造函數(shù)自己創(chuàng)造對(duì)象和返回對(duì)象的步驟。
原型屬性prototype
- 有能力給對(duì)象添加屬性和方法
- 不太明白用法...
var option = option || {};
function A(){
function B(){
console.log("Hello XMG!");
}
return B;
}
var b = A();
b();//Hello XMG!
技法最大目的: 全局變量私有化
閉包的最大用處有兩個(gè):
可以讀取函數(shù)內(nèi)部的變量
讓這些變量的值始終保持在內(nèi)存中。
所有的全局變量都是Windows屬性. 所以可以文件各個(gè)地方拿到
!!!在函數(shù)內(nèi)部的變量前面沒(méi)有var用來(lái)聲明就代表是全局變量
函數(shù)嵌套的變量取值采用就近原則 :
變量的查找過(guò)程(查找過(guò)程只能從內(nèi)部向外)
先在現(xiàn)作用域中查找(遍歷)
去父級(jí)-> 祖父級(jí)作用域查找
直到找到全局變量(Window屬性)后還木有找到就報(bào)錯(cuò)
缺點(diǎn): 類似于遞歸, 浪費(fèi)性能. 所以建議盡量不要使用全局變量
引入閉包 : 用于保存局部變量. 但是不能亂用, 過(guò)多容易導(dǎo)致內(nèi)存泄漏.
不污染全局空間!
內(nèi)部所有的臨時(shí)變量執(zhí)行完畢都會(huì)釋放不占內(nèi)存。
可以保存全局?jǐn)?shù)據(jù)。
更新復(fù)雜變量。
(function(){})();
;(function(){})(); //標(biāo)準(zhǔn)寫法
+(function(){})();
-(function(){})();
?(function(){})();
itin 快捷鍵 for in循環(huán)
// 記錄選中的元素
var seleNode = null;
for(var i = 0; i<list.length; i++){
var li = list[i];
if(i == 0){
seleNode = li;
}
li.onmouseover = function () {
// 排他
// 清空上一次的選中
seleNode.className = '';
// 2.設(shè)置當(dāng)前
this.className = 'current';
// 3.記錄當(dāng)前選中
seleNode = this;
}
}
})(document,window);
低級(jí): 定時(shí)器(降低某個(gè)函數(shù)調(diào)用的頻率)
使用了閉包, 具有擴(kuò)展性
閉包傳參. 封裝后可以直接調(diào)用.
function fn(callback,del) {
var timer = null;
//降低這個(gè)函數(shù)調(diào)用的頻率(使用了閉包).
return function () {
clearTimeout(timer);
timer = setTimeout(function () {
if(callback) callback();
},del);
}
}
//只要onresize或者onscroll時(shí)調(diào)用即可.
window.onresize = fn(function () {
console.log(1);
},200);
window.onscroll = fn(function () {
console.log(2);
},300);
var imgs = document.getElementsByTagName('img');
imgs[0].onclick = fn(-5);
function fn(speed) {
var num = 0;
return function () {
num += speed;
this.style.left = num + 'px';
}
}
imgs[1].onclick = fn(5);
所有的構(gòu)造函數(shù)有一個(gè)特點(diǎn):首字母大寫
在js中我們可以理解為只要執(zhí)行以后能夠返回新的對(duì)象的函數(shù)就是構(gòu)造函數(shù)
構(gòu)造函數(shù)技巧的最大目的:創(chuàng)造完全獨(dú)立的對(duì)象,互相之間不影響
將一個(gè)函數(shù)變成對(duì)象并返回, 在這個(gè)函數(shù)的內(nèi)部將this指向函數(shù)本身
只有在和構(gòu)造函數(shù)配合的時(shí)候才有用
相當(dāng)于可以化簡(jiǎn)構(gòu)造函數(shù)自己創(chuàng)造對(duì)象和返回對(duì)象的步驟。