JavaScript
1.嵌套函數(shù)的有趣之處在于它的變量作用域規(guī)則:它們可以訪問嵌套它們(或多重嵌套)的函數(shù)的參數(shù)和變量
2.大多數(shù)方法調(diào)用使用點(diǎn)符號來訪問屬性古瓤,使用方括號(屬性訪問表達(dá)式)也可以進(jìn)行屬性訪問操作壳繁。下面兩個(gè)例子都是函數(shù)調(diào)用0["m"](x,y);a[0](z);
3.方法調(diào)用可能包含更復(fù)雜的屬性訪問表達(dá)式:f().m();
4.方法和this關(guān)鍵字是面向?qū)ο缶幊谭独暮诵?/p>
5.方法鏈-當(dāng)方法的返回值是一個(gè)對象咬清,每個(gè)對象還可以再調(diào)用它的方法,這種方法調(diào)用序列中睬愤,每次調(diào)用的結(jié)果都是另外一個(gè)表達(dá)式的組成部分喳钟,以jQuery庫為例$(":header").map(function(){return this.id}).get().sort();
一等公民函數(shù)
1.在JavaScript中,函數(shù)不僅僅是一種語法猎莲,也是值,這意味著可以將函數(shù)賦值給變量技即,存儲在對象的屬性或數(shù)組的元素中著洼,作為參數(shù)傳入另外一個(gè)函數(shù)
2.在Java中,函數(shù)是程序的一部分,但無法被程序操作
JS可選形參
function getPropertyNames(o,/*optional*/ a){
if(a===undefined)a=[];
for(var property in o)a.push(property);
return a;
}
var a = getPropertyNames(o);//將o的屬性存儲到一個(gè)新數(shù)組中
getPropertyNames(p,a);//將P的屬性附加至數(shù)組中
可變長的參數(shù)列表:實(shí)參對象##
1.當(dāng)調(diào)用函數(shù)的時(shí)候傳入的實(shí)參個(gè)數(shù)超過函數(shù)定義時(shí)的形參個(gè)數(shù)時(shí)身笤,沒有辦法直接獲得未命名值的引用豹悬,參數(shù)對象解決了這個(gè)問題
2.在函數(shù)體內(nèi),標(biāo)識符arguments是指向?qū)崊ο蟮囊靡狠瑢?shí)參對象是一個(gè)類數(shù)組對象
3.JavaScript的默認(rèn)行為是省略的實(shí)參都將是undefined瞻佛,多出的參數(shù)會自動(dòng)省略
可變長的參數(shù)列表:不定實(shí)參函數(shù)
function max(/*...*/){
var max = Number.NEGATIVE_INFINITY;
for(var i = 0 ;i < arguments.length;i++)
if(arguments[i] > max) max = arguments[i];
return max;
}
varargs function=>不定實(shí)參函數(shù)
自定義函數(shù)屬性
uniqueInteger.counter = 0 ;
//每次調(diào)用這個(gè)函數(shù)都會返回一個(gè)不同的整數(shù)
//它使用一個(gè)屬性來記住下一次將要放回的值
function uniqueInteger(){
return uniqueInteger.counter++;
}
1.JavaScript中的函數(shù)并不是原始值,而是一種特殊的對象娇钱,也就是說函數(shù)可以擁有屬性
2.當(dāng)函數(shù)需要一個(gè)"靜態(tài)"變量來在調(diào)用時(shí)保持某個(gè)值不變伤柄,最方便的方式就是給函數(shù)定義屬性,而不是定義全局變量(定義全局變量會讓命名空間變得更加雜亂無章
作為命名空間的函數(shù)
//將模塊代碼放入函數(shù)中文搂,應(yīng)對不同上下文中命名空間可能的沖突
function mymodule(){
//這個(gè)模塊所使用的所有變量都是全局變量适刀,而不是污染全局命名空間
}
mymodule();
以上代碼也定義了一個(gè)單獨(dú)的全局變量,名叫"mymodule"的函數(shù)
===========================================================
(function(){ //mymodule()函數(shù)重寫為匿名的函數(shù)表達(dá)式
//模塊代碼
//例如:處理瀏覽器兼容性常用煤蹭,依據(jù)對客戶端環(huán)境的判斷返回不同的值
}()); //結(jié)束函數(shù)定義并立即調(diào)用它
===========================================================
定義匿名函數(shù)并立即在單個(gè)表達(dá)式中調(diào)用它的寫法非常常見笔喉,已經(jīng)成為一種慣用法
1.在變量中聲明的變量在整個(gè)函數(shù)體內(nèi)都是可見的(包括在嵌套的函數(shù)中),在函數(shù)的外部是不可見的
2.不在任何函數(shù)內(nèi)聲明的變量是全局變量硝皂,在整個(gè)JavaScript程序中都是可見的
3.在JavaScript中是無法聲明只在一個(gè)代碼塊內(nèi)可見的變量的然遏,基于這個(gè)原因,我們常常簡單地定義一個(gè)函數(shù)用作臨時(shí)的命名空間吧彪,在這個(gè)命名空間內(nèi)定義的變量都不會污染到全局命名空間
prototype屬性
-每一個(gè)函數(shù)都包含一個(gè)prototype屬性,這個(gè)屬性是指向一個(gè)對象的引用丢早,這個(gè)對象叫做"原型對象"(prototype object)
-每一個(gè)函數(shù)都包含不同的原型對象姨裸,當(dāng)將函數(shù)用作構(gòu)造函數(shù)的時(shí)候,新創(chuàng)建的對象會從原型對象上繼承屬性
高階函數(shù)
-所謂高階函數(shù)(higher-order function)就是操作函數(shù)的函數(shù)
-它接收一個(gè)或多個(gè)函數(shù)作為參數(shù)怨酝,并返回一個(gè)新函數(shù)
純粹函數(shù)式編程
var data = [1,1,3,5,5] //我們要處理的數(shù)據(jù)
var sum = function(x,y){return x+y;}; //兩個(gè)初等函數(shù)
var product = function(x,y){return x*y;};
var neg = partial(product , -1);
var square = partial(Math.pow ,undefined ,2);
var sqrt = partial(Math.pow,undefined,.5);
var reciprocal = partial(Math.pow,undefined,-1);
//現(xiàn)在開始計(jì)算平均差和標(biāo)準(zhǔn)差傀缩,所有的函數(shù)調(diào)用都不帶運(yùn)算符
//這段代碼看起來很像Lisp代碼
var mean = product(reduce(data,sum),reciprocal(data.length));
var stddev = sqrt(product(reduce(map(data,
compose(square,
partial(sum,neg(mean)))),
sum),
reciprocal(sum(data.length,-1))));