js函數基礎
函數就是包裹在花括號中的代碼塊,前麵使用了關鍵詞function;當調用該函數時會執行函數內的代碼;可以在某事件發生時直接調用函數(比如當用戶點擊按鈕時),並且可由JavaScript在任何位置進行調用(js對大小寫敏感,關鍵詞function必須是小寫的並且必須以與函數名稱相同的大小寫來調用函數)
js中創建函數的方式及區別:
1.函數聲明
eg:
function sum1(n1,n2){
return n1+n2;
};
2.函數表達式,又叫函數字麵量
eg:
var sum2=function(n1,n2){
return n1+n2;
};
兩者的區別:解析器會先讀取函數聲明,並使其在執行任何代碼前可以訪問,而函數表達式則必須等解析器執行到他所在的代碼行才會真正被解釋執行。
js中函數調用形式:
1.函數調用形式:函數調用形式是最常見的形式,也是最好理解的形式。所謂函數形式就是一般聲明函數後直接調用即是
eg:
function func() { alert("Hello World"); }//聲明一個函數,並調用
func();
或
var func = function() { alert("你好,程序員"); };//使用函數的Lambda表達式定義函數,然後調用
func();
這兩段代碼都會在瀏覽器中彈出一個對話框,顯示字符串中的文字,這個就是函數調用;可以發現函數調用很簡單,就是平時學習的一樣,這裏的關鍵是,在函數調用模式中,函數裏的this關鍵字指全局對象,如果在瀏覽器中就是window對象
2.方法調用形式:將函數賦值給一個對象的成員以後,就不一樣了。將函數賦值給對象的成員後,這個就不再稱為函數,而應該叫做方法
eg:
var func = function() { alert("我是一個函數麼?"); };// 定義一個函數
var o = {};// 將其賦值給一個對象
o.fn = func; // 注意這裏不要加圓括號
o.fn();// 調用
此時,o.fn 則是方法,不是函數了;實際上 fn 的方法體與 func 是一模一樣的,但是這裏有個微妙的不同。
函數調用與方法調用的區別:函數調用中this專指全局對象window,而在方法中this專指當前對象,即o.fn中的 this 指的就是對象o
3.構造器模式調用:同樣是函數,在單純的函數模式下this表示window;在對象方法模式下this指的是當前對象;除了這兩種情況,JavaScript中函數還可以是構造器;將函數作為構造器來使用的語法就是在函數調用前麵加上一個new關鍵字
eg:
var Person = function() {// 定義一個構造函數
this.name = "程序員";
this.sayHello = function() {
alert("你好,這裏是" + this.name);
};
};
var p = new Person();// 調用構造器,創建對象
p.sayHello();// 使用對象
這個例子首先創建了一個構造函數Person,然後使用構造函數創建對象p,這裏使用new語法,然後使用對象調用sayHello()方法;從例子中可以看出:此時this指的是對象本身;除去這個簡單的使用外,構造函數還有幾個變化:
(1)程序在執行到這一句的時候不會執行函數體,因此JavaScript的解釋器並不知道這個函數的內容
(2)接下來執行new關鍵字,創建對象,解釋器開辟內存,得到對象的引用,將新對象的引用交給函數
(3)緊接著執行函數,將傳過來的對象引用交給this;也就是說,在構造方法中,this就是剛剛被new創建出來的對象
(4)然後為this添加成員,也就是為對象添加成員
(5)最後函數結束,返回this,將this交給左邊的變量
分析過構造函數的執行以後,可以得到,構造函數中的this就是當前對象
在構造函數中return的意義發生了變化,首先在構造函數中如果返回的是一個對象,那麼就保留原意;如果返回的是非對象,比如數字、布爾和字符串,那麼就返回 this,如果沒有return語句,那麼也返回this,看下麵代碼:
4.apply調用模式:除了上述三種調用模式以外,函數作為對象還有apply方法與call方法可以使用,這便是第四種調用模式,我稱其為apply模式
首先介紹 apply 模式,首先這裏 apply 模式既可以像函數一樣使用,也可以像方法一樣使用,可以說是一個靈活的使用方法。首先看看語法:函數名.apply(對象, 參數數組);
eg:
// js1.js 文件中
var func1 = function() {
this.name = "程序員";
};
func1.apply(null);
alert(name);
// js2.js 文件
var func2 = function() {
this.name = "程序員";
};
var o = {};
func2.apply(o);
alert(o.name);
分別運行著兩段代碼,可以發現第一個文件中的name屬性已經加載到全局對象window中;而第二個文件中的name屬性是在傳入的對象o中,即第一個相當於函數調用,第二個相當 於方法調用;這裏的參數是方法本身所帶的參數,但是需要用數組的形式存儲在實際上,使用apply模式和call模式可以任意操作控製this的意義,在函數js的設計模式中使用廣泛;簡單小結一下,js中的函數調用有四種模式,分別是:函數式、方法式、構造器式和apply式. 而這些模式中,this的含義分別為:在函數中this是全局對象window,在方法中this指當前對象,在構造函數中this是被創建的對象,在apply模式中this可以隨意的指定,在apply模式中如果使用null,就是函數模式,如果使用對象,就是方法模式。
js函數有哪些方法:
apply():將函數作為對象的方法來調用,將形參以數組形式傳遞給該方法;
call():將函數作為對象的方法來調用,將指定參數傳遞給該方法;
toString():返回函數的字符串表示;
js的函數調用會另外奉送兩個參數,就是this和arguments;arguments是參數組,他並不是一個真實的數組,但是可以使用.length方法獲得長度;arguments對象:存放實參的參數列表,僅能在函數體內使用,帶有下標屬性但並非數組,函數聲明時自動初始化;
arguments對象屬性:
1.length-獲取函數實參長度,
2.callee-返回當前正在指定的函數,
3.caler:返回調用當前正在執行函數的函數名
函數參數:包括形參和實參:
1.形參是定義函數時使用的參數,接收調用該函數時傳遞的參數;
2.實參是調用函數時傳遞給函數的實際參數;
3.參數特性:參數個數沒有限製:實參《形參-多餘形參=undefined,實參》,形參—多餘實參被忽略;參數的數據類型沒有限製;通過arguments對象訪問參數數組;參數
始終按值傳遞:基本類型-傳值,引用類型-傳址;
指針標識:
1.this:指向當前操作對象;
2.callee:指向參數集合所屬函數;
3.prototype:指向函數附帶的原型對象;
4.constructor:指向創建該對象的構造函數
最後更新:2017-04-13 19:46:54