JS函數

語法

function 函數名([形參列表]){
執行代碼
}
函數名([實參列表])

函數定義

  • 函數聲明
    var x=add(2,3);
    function add(number1,number2){
    var sum=number1+number2;
    return sum;
    }

  • 函數表達式
    將匿名函數賦值給變量
    var add= function(number1,number2){
    var sum=number1+number2;
    return sum;
    }
    var x=add(2,3);
    var y=add(2);//實參數量小于形參
    var y=add(2,3,4);//實參數量多于形參

  • 對象實例化(構造函數)
    var add=new Function("i","j",return(i+j));

區別
函數聲明的方式定義函數可以在聲明前調用,而函數表達式和實例化必須在定義函數后調用
實例化的函數定義方法無法識別父函數的變量
(function(){
var i=10;
var add = new Function("j","console.log(i+j);debugger;")
add(1);})()

2.利用argument進行函數計算
function add(){
var sum =0,parameter;
for(i=0;i<=arguments.length; i++){
parameter = arguments[i];
sum = sum + parameter;
}
return sum;
}
3.參數為原始類型,值傳遞
function increment(number){
number = number +1;
return number;
}
var a=1;
var x=increment(a);2
a;//1,只傳遞值,原始值不改變

  • 參數為對象類型,引用傳遞
    function increment(person){
    person.age=person.age+1;
    return person;
    }
    var jerry={name:"jerry",age:9};
    var x=increment(jerry);
    x;
    jerry;//{name:"jerry",age:10}原始值被改變

作用域

  • 變量起作用的范圍


若內部沒有相應的作用對象,則會作用到外部


  • 作為對象屬性
    var point{
    x:1,
    y:1,
    move:function(stepX,stepY){
    this.x+=stepX;this即指函數作用的對象
    this.y+=stepY;
    }

    point.move(2,1);
    

構造函數

  • 構造函數
    function Point(x,y){
    this.x=x;
    this.y=y;
    this.move=function(stepX,stepY){
    this.x+=stepX;
    this.y+=stepY;
    }
    var point1=new Point(1,1);//{x:1,y:1,move:function(stepX,stepY){}}
    var point2=new Point(1,2);

  • 原型 設置共用的方法函數

function Point(x,y){
    this.x=x;
    this.y=y;
  }
  Point.prototype.move=function(stepX,stepY){
     this.x+=stepX;
     this.y+=stepY;
  }
  var point=new point(1,1);
  point.move(2,1);//x:3,y:2
 function Car(type,color){
    this.type=type;
    this.color=color;
    this.status="stop";
    this.light="off";
  }
  //在原型函數的基礎上創建新的方法
  Car.prototype.start=function(){
    this.status="start";
    this.light="on";
    console.log(this.type+"is"+this.status);
  }
 Car.prototype.stop=function(){
    this.status="stop";
    this.light="off";
  }
  var audi=new Car("audi","sliver");
  var benzi=new Car("benzi","black");
  audi.start;//調用方法
  benzi.stop;
  audi.status;//訪問屬性
  audi.light="off";
  • 構造函數與普通函數的區別
    1.本質上沒有區別
    2.構造函數通常會有this指定實例屬性,原型對象上通常有一些公共方法
    3.構造函數命名通常首字母大寫

函數調用(this)

調用模式

  • 構造函數調用模式

  • 方法調用模式
    audi.start

  • 函數調用模式
    函數調用沒有指明特定對象時function(),this指向全局變量即window
    內部方法的子函數無法調用到this
    var myNumber ={
    value:1,
    double: function(){
    var that = this;
    var helper = function(){
    that.value=add(that.value,that.value);
    }
    helper();
    }

  • apply(call)調用模式
    借用其他函數的方法Function.prototype.apply()
    function Point(x,y){
    this.x= x;
    this.y= y;
    }
    Point.prototype.move=function(x,y){
    this.x+=x;
    this.y+=y;
    }
    var p = new Point(0,0);
    p.move(2,2);
    var circle={x=1,y=1,r=1};
    Point.prototype.apply(circle,[2,1]);//x=3,y=2,z=1

     // Function.prototype.bind()
    var circlemove=Point.prototype.bind(circle,2,1);//綁定函數不直接執行
    setTimeout(circlemove,1000);//延遲執行函數
    

函數調用參數

  • Array-like
    arguments[index]
    arguments[length]
  • arguments.callee

遞歸

  function factorial(i){
      if(i==0){
          return 1;}//遞歸函數的退出條件
     return i*factorial(i-1);//調用函數本身
  }

閉包

  • 屬性隱藏,對象封裝
    在函數內部含有子函數,子函數調用了父函數的變量


  • 記憶函數(不懂)
    var factorial=(function(){
    var count=0;
    var fac= function(i){
    count++;
    if(i==0){
    console.log("調用次數"+count);
    return 1;}//遞歸函數的退出條件
    return i*factorial(i-1);//調用函數本身
    }
    return fac
    })()

    for (var i=0;i<=10;i++){
       console.log(factorial(i));//調用函數
    }
    

First-class function

  • 函數柯里化curry
    將接受多個參數的函數轉為接受單一參數的函數,返回的的函數可以接受后續參數
  • 回調
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容

  • 函數定義 函數聲明 函數表達式 函數實例化 不同函數定義方式的區別: 聲明提前:代碼執行前先對變量定義、函數聲明進...
    angelwgh閱讀 295評論 0 0
  • 函數聲明和函數表達式有什么區別 (*)解析器會率先讀取函數聲明,并使其在執行任何代碼之前可以訪問;函數表達式則必須...
    coolheadedY閱讀 399評論 0 1
  • 一.通過關鍵字 function 定義 1.函數可以通過聲明定義,也可以是一個表達式。1)聲明:function ...
    小甜妮子__閱讀 474評論 0 0
  • 1.中年男子騎著電動三輪車逆行。快到交通路口的時候,發現前方有倆交警。于是第一反應調轉車頭,誰知迎面而來的摩托車車...
    aftertwelve閱讀 151評論 0 0
  • 隨著喪尸題材電影愈發的流行,恐怖片的種類也越來越多,這部《釜山行》可以說是一部將恐怖血腥與倫理、人性掛鉤的好作品...
    MSJOYCEE閱讀 149評論 0 0