1. 閉包
1 閉包的作用:
延長(zhǎng)變量的生命周期架谎;
提供一種間接訪問函數(shù)封閉空間內(nèi)部數(shù)據(jù)的方法讲冠。
保護(hù)數(shù)據(jù)讓代碼更安全和穩(wěn)定先鱼。
2 setTimeOut和閉包:
js本身是單線程俭正。
單線程的局限性:執(zhí)行多個(gè)任務(wù)時(shí),只能串行的執(zhí)行任務(wù)型型。
js的主要任務(wù)(優(yōu)先順序):
(1)渲染任務(wù)
(2)腳本中的主要代碼
(3)事件處理任務(wù)(定時(shí)器事件|點(diǎn)擊事件等等)
因此在for循環(huán)中段审,setTimeout獲取不到i的值全蝶。
補(bǔ)充:
并發(fā)和并行的區(qū)別:
并發(fā):多條線程同時(shí)執(zhí)行任務(wù)的現(xiàn)象闹蒜;
并行:同時(shí)執(zhí)行多個(gè)任務(wù)的能力。
2. 函數(shù)
函數(shù)本質(zhì)上是一個(gè)對(duì)象抑淫,因此凡是可以使用對(duì)象的地方都可以使用函數(shù)绷落。函數(shù)可以作為其他函數(shù)的參數(shù)或返回值。
函數(shù)可以創(chuàng)建作用域始苇;也可以有自己的屬性和方法砌烁。
1 函數(shù)的創(chuàng)建:
函數(shù)聲明 function 函數(shù)名(參數(shù)){函數(shù)體}
表達(dá)式
var func = function(){}; //匿名的函數(shù)表達(dá)式
var func = function name(){}; //命名的函數(shù)表達(dá)式
構(gòu)造函數(shù) var func = new Function();
函數(shù).name:獲取函數(shù)的名稱
eg: var func01 = function(){};
var func02 = function funcName(){};
console.log(func01.name); //火狐中 空
console.log(func02.name); //funcName
2 函數(shù)的回調(diào):函數(shù)可以作為參數(shù)或者返回值。
注意:函數(shù)作為參數(shù)進(jìn)行回調(diào)時(shí)催式,this指針問題
如果回調(diào)函數(shù)是某個(gè)對(duì)象的方法函喉,而該對(duì)象方法中使用了this指針,那么該方法作為回調(diào)函數(shù)來使用的時(shí)候荣月,this指針會(huì)改變管呵。、
通過在函數(shù)內(nèi)部對(duì)傳入的參數(shù)做修正this的處理即可哺窄。
eg: var name = "測(cè)試名稱";
function demo(callBack){ //callBack是一個(gè)函數(shù)
//callBack(); //callBack()調(diào)用 this->window show 測(cè)試名稱
//要想還讓this指向?qū)ο?需要call|apply
callBack.call(obj);
}
var obj = {
name:"張三",
show:function(){
console.log("show" + this.name);
}
}
demo(obj.show); //通過callBack.call(obj);將this指向obj, show 張三
3.惰性函數(shù)(自定義函數(shù))
【通過函數(shù)直接調(diào)用】在第二次調(diào)用函數(shù)的時(shí)候捐下,這個(gè)函數(shù)才被真正的定義。第一次調(diào)用萌业,知識(shí)做一些初始化的操作坷襟;
惰性函數(shù)缺點(diǎn):
(1)實(shí)現(xiàn)自我更新之后,會(huì)把之前函數(shù)上面的屬性丟失;
(2)把函數(shù)賦值給變量或者對(duì)象的方法之后生年,以變量或者對(duì)方法來調(diào)用婴程,就不會(huì)自我更新
eg:
function foo(){
//初始化操作
console.log("foo");
foo = function(){
console.log("foo foo");
}
}
foo.des = "foo的描述信息";
// console.log(foo.des);
// foo(); //foo //函數(shù)直接調(diào)用
// foo(); //foo foo
// foo(); //foo foo
// console.log(foo.des); //undefined
var demo = foo; //如果通過賦值給別的函數(shù)調(diào)用,就不會(huì)出現(xiàn)覆蓋問題
demo(); //foo
demo(); //foo
demo(); //foo
console.log(demo.des); //foo的描述信息
4.即時(shí)對(duì)象初始化
寫法:
(1)提供一個(gè)對(duì)象{}
(2)在對(duì)象中提供一個(gè)初始化方法抱婉,用作初始化操作
(3)在對(duì)象外部添加()排抬,包裝成一個(gè)表達(dá)式
(4)直接使用.init()來進(jìn)行初始化處理
eg: