1范舀、函數(shù)是根基

函數(shù)的聲明

  1. function關(guān)鍵字
  2. 可選名稱(有效的Javascript標識符)
  3. 括號內(nèi)部伦意,一個以逗號分隔的參數(shù)列表(有效的Javascript標識符竖般,列表可以為空)
  4. 函數(shù)體,包含在大括號內(nèi)的一系列Javascript語句(函數(shù)體可以為空)
//在全局作用域下定義一個函數(shù)
function a(){}
console.log(typeof window.a==="function"); // ture  window對象上的同名屬性會引用這個函數(shù)
console.log(a.name==="a"); // true  所有函數(shù)都有一個name屬性届垫,保存該函數(shù)名稱的字符串

//創(chuàng)建一個匿名函數(shù)并賦值給變量b
var b = function (){};
console.log(typeof window.b==="function"); // ture 
console.log(b.name==="b"); // true  在舊瀏覽器下這樣定義的函數(shù)的name屬性為空或者undefined

//創(chuàng)建一個匿名函數(shù)并引用到window對象的一個屬性
window.c=function(){};
console.log(typeof window.c==="function"); // true
console.log(c.name===""); // true  在舊瀏覽器下這樣定義的函數(shù)的name屬性為undefined

//在全局作用域下創(chuàng)建outer函數(shù)释液,并在內(nèi)部創(chuàng)建inner函數(shù)
function outer(){
   console.log(typeof inner==="function"); // true  在inner創(chuàng)建之前可以訪問到inner
   function inner(){}
   console.log(typeof inner==="function"); // true  在inner創(chuàng)建之后可以訪問到inner
   console.log(typeof window.inner==="undefined"); // true  inner沒有被綁定到全局對象上去
}

//創(chuàng)建一個函數(shù)并引用到window對象的一個屬性
window.e=function d(){};
console.log(e.name==="d"); // true  這樣創(chuàng)建的函數(shù)只能使用e來調(diào)用,但它的name屬性是函數(shù)本身的字面量名稱

作用域和函數(shù)

函數(shù)可以在其作用域范圍內(nèi)提前被引用装处,但變量不行误债。


函數(shù)調(diào)用

  1. 作為函數(shù)進行調(diào)用
  2. 作為一個對象在對象上進行調(diào)用
  3. 作為構(gòu)造器進行調(diào)用浸船,創(chuàng)建一個新對象
  4. 通過apply()或call()方法進行調(diào)用
//定義一個包含參數(shù)的函數(shù)
function f(a,b,c){}
f(1); // 當參數(shù)數(shù)量少于定義的形參執(zhí)行函數(shù)時,1會被賦值給a寝蹈,而b李命、c會被賦值為undefined
f(1,2,3,4,5); // 當參數(shù)數(shù)量多于定義的形參執(zhí)行函數(shù)時,1,2,3會被分別賦值給a,b,c箫老,而4,5不會賦值給任何形參

所有函數(shù)調(diào)用都會傳遞兩個隱式參數(shù):arguments和this封字。
arguments參數(shù)是傳遞給函數(shù)的所有參數(shù)的一個集合,具有l(wèi)ength屬性耍鬓,可以使用for對其進行遍歷阔籽,但不是真正的Javascript數(shù)組,無法使用數(shù)組的方法牲蜀,是一個類似數(shù)組的結(jié)構(gòu)笆制,只擁有數(shù)組的某些特性。
this參數(shù)引用了與該函數(shù)調(diào)用進行隱式關(guān)聯(lián)的一個對象涣达,稱之為:函數(shù)上下文在辆。this的指向依賴于函數(shù)的調(diào)用方式,即便調(diào)用的函數(shù)相同度苔,調(diào)用的方式不一樣开缎,this的指向也會不一樣。

函數(shù) “作為函數(shù)” 調(diào)用

當一個函數(shù)以 “作為函數(shù)” 的方式進行調(diào)用時林螃,表示應(yīng)用了()操作符的表達式,并且沒有將函數(shù)作為對象的一個屬性俺泣。例如:

function a(){  return this  }
a();
console.log(a()===window); //  true

var b=function (){  return this  };
b();
console.log(a()===window); //  true
//以這種方式調(diào)用時疗认,函數(shù)的上下文是全局上下文window對象,及this的指向為window對象
函數(shù) “作為方法” 調(diào)用

當一個函數(shù)以 “作為方法” 的方式進行調(diào)用時伏钠,表示函數(shù)被賦值給一個對象的屬性横漏,并使用引用該函數(shù)的屬性進行調(diào)用,例如:

var a={};
a.b=function (){ return this };
a.b(); //  以這種方式調(diào)用時熟掂,函數(shù)的上下文是當前對象
console.log(a.b()===a); // ture

其實函數(shù) “作為函數(shù)” 的調(diào)用方式是 “作為方法” 調(diào)用方式的一種特殊情況缎浇。 “作為函數(shù)” 的調(diào)用時,函數(shù)其實是綁定在window對象上的赴肚,window對象就是當前函數(shù)的上下文素跺。省略了window對象調(diào)用的方式,直接使用函數(shù)字面量進行調(diào)用誉券。

面向?qū)ο笞兂傻幕靖拍钪恢秆幔褪俏覀兛梢栽谌我夥椒ㄖ校ㄟ^this的指向來引用該方法所屬的對象踊跟。

函數(shù)作為構(gòu)造器調(diào)用
function A(){ this.b=function(){ return this }}
var c=new A(); // 在函數(shù)調(diào)用前使用new關(guān)鍵字表示函數(shù)作為構(gòu)造器進行調(diào)用
console.log(c.b()===c); // true  構(gòu)造函數(shù)創(chuàng)建的實例中this指向當前對象踩验。

作為構(gòu)造器調(diào)用時,會發(fā)生以下行為:

  1. 創(chuàng)建一個新的空對象。
  2. 將新對象的this參數(shù)傳遞給構(gòu)造器函數(shù)箕憾,從而新對象的函數(shù)上下文成為構(gòu)造器的函數(shù)上下文牡借。
  3. 如果沒有顯示的返回值,則新對象作為構(gòu)造器的返回值進行返回(任何干擾這種意圖的都不適合作為構(gòu)造器)袭异。

一般的函數(shù)和方法以小寫字母開頭钠龙,構(gòu)造器函數(shù)以大寫字母開頭。

使用apply()和call()方法進行調(diào)用

Javascript中函數(shù)也可以像對象一樣擁有方法和屬性扁远,每個函數(shù)都有apply()和call()方法俊鱼。
通過apply()調(diào)用函數(shù),需要傳入兩個參數(shù)畅买,一個是作為函數(shù)上下文的對象并闲,另一個是函數(shù)參數(shù)所組成的數(shù)組。call()方法與之類似谷羞,唯一不同的是call()方法給函數(shù)傳入的是參數(shù)列表帝火,而不是將所有參數(shù)作為一個數(shù)組傳入。

function x(a,b){
    this.y=a+b;
}
var a={};
var b={};
x.apply(a,[1,2]);
x.call(b,1,2);
console.log(a.y); // 3  此時x函數(shù)中的this被綁定為a對象
console.log(b.y); // 3  此時x函數(shù)中的this被綁定為b對象

Javascript是函數(shù)式編程語言湃缎,函數(shù)式程序的構(gòu)件塊而不是命令式語句犀填。

//一般的命令式編程
function (list){
   for(var i=0;i<list.length;i++){
      /* 每一項需要執(zhí)行的代碼 */
   }
}

//函數(shù)式編程
for(var i=0;i<list.length;i++){
   fun(list[n]);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嗓违,隨后出現(xiàn)的幾起案子九巡,更是在濱河造成了極大的恐慌,老刑警劉巖蹂季,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冕广,死亡現(xiàn)場離奇詭異,居然都是意外死亡偿洁,警方通過查閱死者的電腦和手機撒汉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涕滋,“玉大人睬辐,你說我怎么就攤上這事”龇危” “怎么了溯饵?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锨用。 經(jīng)常有香客問我瓣喊,道長,這世上最難降的妖魔是什么黔酥? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任藻三,我火速辦了婚禮洪橘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棵帽。我一直安慰自己熄求,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布逗概。 她就那樣靜靜地躺著弟晚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逾苫。 梳的紋絲不亂的頭發(fā)上卿城,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音铅搓,去河邊找鬼瑟押。 笑死,一個胖子當著我的面吹牛星掰,可吹牛的內(nèi)容都是我干的多望。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼氢烘,長吁一口氣:“原來是場噩夢啊……” “哼怀偷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起播玖,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤椎工,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蜀踏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晋渺,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年脓斩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畴栖。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡随静,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吗讶,到底是詐尸還是另有隱情燎猛,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布照皆,位于F島的核電站重绷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏膜毁。R本人自食惡果不足惜昭卓,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一愤钾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧候醒,春花似錦能颁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敌土,卻和暖如春镜硕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背返干。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工兴枯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犬金。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓念恍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晚顷。 傳聞我的和親對象是個殘疾皇子峰伙,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,238評論 0 4
  • 函數(shù)參數(shù)的默認值 基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認值该默,只能采用變通的方法瞳氓。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,402評論 0 1
  • 第一章司機與乘客 本章主要是講述角色定位的問題,生活和工作中的我們栓袖,總是會面對不同角色的轉(zhuǎn)換匣摘,工作中我們會調(diào)崗,晉...
    知行者悟空閱讀 8,205評論 2 1
  • 山本耀司的喃喃自語裹刮,他說黑色分三種音榜,綠色的黑,褐色的黑與墨黑捧弃,白色不是色赠叼,是光的亮度。服裝有“間”违霞,讓空氣在皮膚與...
    木卯丁閱讀 161評論 0 2