1.javascript是一門函數式語言,在javascript中,函數式第一形對象,也就是說,函數是能夠共處的。它能夠被引用,或聲明稱對象字面量,甚至能夠做爲參數進行傳遞。在JavaScript中,函數擁有對象的全部功能。javascript
JavaScript函數是經過函數字面量進行聲明從而建立函數值的。java
函數字面量由四個部分組成編程
1.function關鍵字數組
2.可選名稱,若是指定名稱,名稱必須爲有效的JavaScript標識符。若不指定名稱,則爲匿名函數。若是一個函數不須要名稱就能調用,則不須要爲它命名。app
3.括號內部,以逗號爲分隔的參數列表。函數
4.函數體 ,包括在大括號內的一系列JavaScript語句。this
全部函數都擁有name屬性,匿名函數的name值爲空字符串。spa
具名函數的聲明有兩種方式:code
1. 函數聲明式 2. 函數字面量式對象
//函數聲明式 function bar () {} //函數字面量式 var foo = function () {}
在JavaScript中,做用域是由function進行聲明的,而不是代碼塊。聲明的做用域建立於代碼塊,可是不終結於代碼塊,這是JavaScript不一樣於其餘面嚮對象語言的特徵之一。例如:
if(text){ var x=321; } alert(x);
在譬如java的其餘語言中,咱們但願x終結於if語句的關閉大括號,alert會彈出一個undefined值。可是在JavaScript中,運行上述代碼,咱們會彈出321。這是由於,在JavaScript中,大括號關閉處並不會終止x的做用域。
JavaScript的做用域規則具體爲:
1.變量聲明的做用域開始於聲明的地方,結束語所在函數的結尾,與代碼的嵌套無關。
2.命名函數的做用域是指聲明該函數的整個函數範圍,與代碼的嵌套無關。又稱爲機制提高。函數提高是整個代碼塊提高到它所在的做用域的最開始執行。
3.值得注意的是,函數能夠在其做用域內被提早引用,可是變量不行。
有四個不一樣的方式能夠進行函數調用,它們分別是:
1.做爲一個函數進行調用,這是最簡單的形式。
function text(){ }; text(); var mobile = function(){ }; mobile();
2.做爲一個方法進行調用,在對象上進行調用,支持面向對象編程。
當一個函數被賦值給對象的一個屬性,並使用引用改函數的這個屬性進行調用時,那麼函數就是做爲一個方法進行調用。例如:
var a = {}; a.whatever = function() {}; a.whatever;
3.做爲構造器進行調用,建立一個新對象。
將函數做爲構造器使用,咱們要在函數調用前使用 new 關鍵字。
function text(){ return this; }; //若是咱們要將text()函數做爲構造器進行調用,則要: new text();
在構造器調用時,以下特殊行爲將會發生:
建立一個新的空對象。
傳遞給構造器的對象是this參數,從而成爲構造器的函數上下文。
若是沒有顯式的返回值,新建立的對象則做爲構造器的返回值進行返回。
所以,構造器的目的是要建立一個新對象並對其進行設置,而後將其做爲構造器的返回值進行返回。即經過函數調用初始化建立新的對象。經過構造器,咱們能更容易地創造出多個對象,而無需一次又一次進行相同的代碼輸入。
4.使用apply()和call()方法進行調用
這兩種方法都可以顯式指定任何一個對象做爲函數調用的函數上下文,而無需在乎this傳遞的參數。
這兩種方法的區別在於:apply()傳入的參數爲做爲函數上下文的對象與參數數組,而call()傳入的是做爲函數上下文的對象和參數列表而不是數組。