javascriptのfunction

1.函數聲明

使用關鍵字funciton關鍵字來聲明,後面跟上一組參數以及函數體.

無參數

function boy() {      //函數的聲明
    //代碼
}

函數的聲明已經完成,但是還不能運行,這是我們需要調用函數才能是這個函數運行.

box();  //函數的調用,調用的位置可以放在函數聲明的前面        

有參數

function boy(name,age) {
    //代碼
}
boy("name",age);

如果不傳參數進去,就會定義爲undefined


函數表達式

var print = function (){
  // ...
};

採用函數表達式聲明函數時,function命令後面不帶有函數名。如果加上函數名,該函數名只在函數體內部有效,在函數體外部無效。

var print = function x(){
  console.log(typeof x);
};

x
// ReferenceError: x is not defined

print()
// function

這個x只在函數體內部可用,指代函數表達式本身,其他地方都不可用。這種寫法的用處有兩個,一是可以在函數體內部調用自身,二是方便除錯(除錯工具顯示函數調用棧時,將顯示函數名,而不再顯示這裏是一個匿名函數)

需要時,可以採用下面的形式聲明函數。
var f = function f() {};

函數的屬性和方法

name屬性
name屬性返回緊跟在function關鍵字之後的那個函數名

function f1() {}
f1.name // 'f1'

var f2 = function () {};
f2.name // ''

var f3 = function myName() {};
f3.name // 'myName'

length屬性
返回函數定義中參數的個數

function f(a, b) {}

f.length   //2

toString

返回函數的源碼

function f() {
    a();
    b();
    c();
}
f.toString();
function f() {
    a();
    b();
    c();
}

函數內內部的註釋也是可以返回的

函數內部的變量提升

var 命令聲明的變量,不管在什麼位置,變量聲明都會被提升到函數體的頭部.

function foo(x) {
    if (x > 100) {
        var tmp = x -100;   
    }
}

等同於
function foo(x) {
    var tmp;
    if (x > 100) {
        tmp = x -100;
    }
}

函數本身的作用域

函數本身也有一個值,也有自己的作用域.她得作用域綁定其聲明時所在的作用域

var a = 1;
var x = function () {
    console.log(a);
};
function f() {
    var a = 2;
    x();
}
f();  //1

函數x在函數f的外面聲明的,所以它的作用域綁定外層,內部變量a不會到函數體f體內取值.

2.return返回值

函數都是調用後直接執行的.實際上,任何函數都可通過return語句跟後面的要返回的值來實現返回值.

function boy() {
    return "Hello world!"            //表示把這句話字符串返回回來
}

這時我們使用boy()進行調用,是沒有作用的.
它實際進行的操作爲:

boy() = "Hello world!";

alert(boy());  //調用函數返回值,然後輸出

有參數的同理是一樣可以得到的.

我們還可以把函數的返回值賦給一個變量,然後通過變量進行操作.
var strInfo =  boy('馬雲',40);
alert(strInfo);

return與具有還有一個功能是退出當前函數

function boy() {
    if( num < 5 ) return num; //滿足條件,返回num
    return 100;  //返回之後,就不執行下面的語句了
}
alert(box(10));

3.arguments對象

ECMAScript函數不介意傳遞進來多少參數,也不會因爲參數不統一而錯誤.實際上,函數體內可以通過arguments對象來接收傳遞進來的參數.

function boy() {
    return arguments[0]+'|'+arguments[1]+'|'+arguments[2];
}

boy("boy",23,"web前端");

可以利用length的屬性(arguments.length),來進行動態操作.

4.重載:根據不同的參數調用相同的函數

function box(num,a) {
    return num + 100;
}

function box(num) {  //第二個函數把第一個函數覆蓋掉,不具備重載功能
    return num + 150;
}

alert(box(50,1)); //重載就是根據參數,選擇相同函數名而參數不同的函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章