Javascript中定義函數的方式有多種,函數直接量就是其中一種。
如var fun = function(){},這里function如果不賦值給fun那么它就是一個匿名函數。好,看看匿名函數的如何被調用。
方式1,調用函數,得到返回值。強制運算符使函數調用執(zhí)行(function(x,y){ alert(x+y); return x+y; }(3,4)); 方式2,調用函數,得到返回值。
強制函數直接量執(zhí)行再返回一個引用,引用再去調用執(zhí)行(function(x,y){ alert(x+y); return x+y;} )(3,4); 這種方式也是很多庫愛用的調用方式,如jQuery,Mootools。 方式3,使用voidvoid function(x) { x = x-1; alert(x);}(9);。
將需要大量處理數據的過程分割成很多小段,然后通過JavaScript的計時器來分別執(zhí)行,就可以防止瀏覽器假死。先看看怎么開始:
function ProcessArray(data,handler,callback){
ProcessArray()方法支持三個參數:
data:需要處理的數據
handler:處理每條數據的函數
callback:回調函數
然后定義一些變量:
var maxtime = 100;
var delay = 20;
var queue = data.concat();
maxtime表示每個處理進程的最大毫秒數。delay表示每個程序塊之間的毫秒數。queue是源數據的復制,雖然不是在所有情景下都必要,但是我們是通過傳遞引用修改的,所以最好還是備份一下。
然后就可以使用setTimeout()方法來處理了:
setTimeout(function(){
var endtime = new Date() + maxtime;
do{
hanler(queue.shift());
}while(queue.length>0 && endtime > new Date());
首先,先計算endtime,這是程序處理的最大時間。do.while 循環(huán)用來處理每一個小塊的數據,直到循環(huán)全部完成或者超時。
為什么使用do..while循環(huán)呢?
JavaScript支持while和do…while循環(huán)。不同之處在于do..while循環(huán)回至少執(zhí)行一次。如果使用while循環(huán),那么當開發(fā)者設置一個很小或者很低的endtime值的時候,那么處理就根本不會執(zhí)行了。
最后,我們再決定是否需要處理其他的數據,如果需要,那么就再調用一次:
if (queue.length > 0) {
setTimeout(arguments.callee, delay);
}
else {
if (callback) callback();
}
}, delay);
}
這樣回調函數會在每一個數據都處理結束的時候執(zhí)行。我們可以通過ProcessArray()來測試一小組數據:
// process an individual data item
function Process(dataitem) {
console.log(dataitem);
}
// processing is complete
function Done() {
console.log("Done");
}
// test data
var data = [];
for (var i = 0; i < 500; i++) data[i] = i;
// process all items
ProcessArray(data, Process, Done);
這個方法在任何瀏覽器中都可以執(zhí)行,不過HTML5提供了更好的辦法,Rockux在以后的文章中會提到。
/*第一種方法,使用function語句,格式如下*/function fn(){ alert("這是使用function語句進行函數定義"); }fn();/*第二種方法,使用Function()構造函數克隆函數*/var F = new Function("a","b","alert(a+b)"); F(a,b);其實相當于如下代碼:function F(a,b){ alert(a+b); }/*第三種方法,使用函數直接量*/var zhenn = function(){ alert("zhenn"); } zhenn();。
JS函數的定義方式比較靈活,它不同于其他的語言,每個函數都是作為一個對象被維護和運行的。
先看幾種常用的定義方式:
function func1([參數]){
/*函數體*/
}
var func2=function([參數]){
/*函數體*/
};
var func3=function func4([參數]){
/*函數體*/
};
var func5=new Function();
上述第一種方式是最常用的方式,不用多說。
第二種是將一匿名函數賦給一個變量,調用方法:func2([函數]);
第三種是將func4賦給變量func3,調用方法:func3([函數]);或func4([函數]);
第四種是聲明func5為一個對象。
再看看它們的區(qū)別:
function func(){
//函數體
}
//等價于
var func=function(){
//函數體
}
但同樣是定義函數,在用法上有一定的區(qū)別。
<script>
//這樣是正確的
func(1);
function func(a)
{
alert(a);
}
</script>
<script>
//這樣是錯誤的,會提示func未定義,主要是在調用func之前沒有定義
func(1);
var func = function(a)
{
alert(a);
}
//這樣是正確的,在調用func之前有定義
var func = function(a)
{
alert(a);
}
func(1);
</script>
用同樣的方法可以去理解第三種定義方式。
第四種定義方式也是需要聲明對象后才可以引用。
1。
使用 window.alert() 彈出警告框。2。
使用 document.write() 方法將內容寫到 HTML 文檔中。3。
使用 innerHTML 寫入到 HTML 元素。4。
使用 console.log() 寫入到瀏覽器的控制臺。JavaScript一種直譯式腳本語言,是一種動態(tài)類型、弱類型、基于原型的語言,內置支持類型。
它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語言,最早是HTML(標準通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增加動態(tài)功能。
將需要大量處理數據的過程分割成很多小段,然后通過JavaScript的計時器來分別執(zhí)行,就可以防止瀏覽器假死。
先看看怎么開始:function ProcessArray(data,handler,callback){ ProcessArray()方法支持三個參數:data:需要處理的數據handler:處理每條數據的函數callback:回調函數 然后定義一些變量:var maxtime = 100;var delay = 20;var queue = data.concat(); maxtime表示每個處理進程的最大毫秒數。delay表示每個程序塊之間的毫秒數。
queue是源數據的復制,雖然不是在所有情景下都必要,但是我們是通過傳遞引用修改的,所以最好還是備份一下。 然后就可以使用setTimeout()方法來處理了:setTimeout(function(){ var endtime = new Date() + maxtime; do{ hanler(queue.shift()); }while(queue.length>0 && endtime > new Date()); 首先,先計算endtime,這是程序處理的最大時間。
do.while 循環(huán)用來處理每一個小塊的數據,直到循環(huán)全部完成或者超時。 為什么使用do..while循環(huán)呢? JavaScript支持while和do…while循環(huán)。
不同之處在于do..while循環(huán)回至少執(zhí)行一次。如果使用while循環(huán),那么當開發(fā)者設置一個很小或者很低的endtime值的時候,那么處理就根本不會執(zhí)行了。
最后,我們再決定是否需要處理其他的數據,如果需要,那么就再調用一次:if (queue.length > 0) { setTimeout(arguments.callee, delay); } else { if (callback) callback(); } }, delay);} 這樣回調函數會在每一個數據都處理結束的時候執(zhí)行。我們可以通過ProcessArray()來測試一小組數據:// process an individual data itemfunction Process(dataitem) { console.log(dataitem);}// processing is completefunction Done() { console.log("Done");}// test datavar data = [];for (var i = 0; i < 500; i++) data[i] = i;// process all itemsProcessArray(data, Process, Done); 這個方法在任何瀏覽器中都可以執(zhí)行,不過HTML5提供了更好的辦法,Rockux在以后的文章中會提到。
定義函數的種方法1.
最基本的作為一個本本分分的函數聲明使用。
復制代碼代碼如下:function func(){}或var func=function(){};2.
作為一個類構造器使用:復制代碼代碼如下:function class(){}
class.prototype={};
var item=new class();3.
作為閉包使用:復制代碼代碼如下:(function(){
//獨立作用域})();4.
可以作為選擇器使用:復制代碼代碼如下:var addEvent=new function(){
if(!-[1,]) return function(elem,type,func){attachEvent(elem,'on'+type,func);};
else return function(elem,type,func){addEventListener(elem,type,func,false);}
};//避免了重復判斷5.
1. 函數調用
function test(){
alert(1);
}
2. 直接調用
test();
3. 指定內部this指針調用
(1)test.call(window);//執(zhí)行test函數,將方法內部this指向window
(2)test.apply(window);///執(zhí)行test函數,將方法內部this指向window
4. 通過事件調用
window.onload = test;//當頁面載入時調用
window.onerror = test;當頁面發(fā)生錯誤時調用
聲明:本網站尊重并保護知識產權,根據《信息網絡傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個月內通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學習鳥. 頁面生成時間:2.627秒