摘要:類型描述在中的所有函數都是類型的對象定義函數的方式函數聲明方式函數名函數體函數聲明方式定義函數函數聲明方式顯示函數聲明方式字面量方式函數名函數體字面量方式定義函數字面量方式顯示字面量方式構造函數方式函數名參數,函數體函數的參數和函數體,都以
Function類型 描述
在JavaScript中的所有函數都是Function類型的對象
定義函數的方式 函數聲明方式function 函數名 () { 函數體 }
/* 函數聲明方式定義函數 */ function fun() { console.log( "函數聲明方式..." ); } fun();// 顯示 函數聲明方式...字面量方式
var 函數名 = function () { 函數體 }
/* 字面量方式定義函數 */ var fu = function () { console.log( "字面量方式..." ); } fu();// 顯示 字面量方式...構造函數方式
var 函數名 = new Function( 參數,函數體 )
函數的參數和函數體,都以字符串形式填寫在括號中,以逗號分隔
在使用構造函數創建一個Function類型的對象時,會得到一個函數
/* 構造函數方式定義函數 */ var fn = new Function( "can", "console.log( can )" ); fn("構造函數方式...");// 顯示 構造函數方式...判斷定義的函數是否為Function類型
/* 函數聲明方式 */ console.log( fun instanceof Function );// true /* 字面量方式 */ console.log( fu instanceof Function );// true /* 構造函數方式 */ console.log( fn instanceof Function );// trueapply()方法
表示用于調用指定函數
該方法接收兩個參數
第一個 - this
第二個 - 一個數組
該數組用于存儲指定函數的所有參數(實參)
/* 定義一個函數 */ function fun( can ) { console.log( can ); } /* 根據函數語法正常調用函數 */ fun( "這是一個函數" );// 顯示 這是一個函數 /* 根據Function對象提供的apply()方法進行函數調用 * 參數 this 可以先用 null 站位 */ fun.apply( null, ["這還是一個函數"] );// 顯示 這還是一個函數call()方法
表示用于調用指定函數
該方法接收兩個參數
第一個 - this
第二個 - 函數的參數
-需求多少參數,寫多少參數,使用逗號分隔
/* 定義一個函數 */ function fun( can, shu ) { console.log( can + shu ); } /* 根據函數語法正常調用函數 */ fun( "這是一個函數", "..." );// 顯示 這是一個函數... /* 根據Function對象提供的call()方法進行函數調用 * 參數 this 可以先用 null 站位 */ fun.call( null, "這還是一個函數", "..." );// 顯示 這還是一個函數...bind()方法
表示創建一個新的函數(稱為綁定函數)
該方法接收兩個參數
第一個 - this
第二個 - 函數的參數
需求多少參數,寫多少參數,使用逗號分隔
該方法的返回值 - 返回一個新的函數
返回的新函數 - 是對指定函數進行復制得到的
兩個函數對函數體進行修改不會相互影響
/* 定義一個函數 */ function fun( can, shu ) { console.log( can + shu ); } /* 根據函數語法正常調用函數 - 對參數進行修改 */ fun( "...", "這是一個函數" );// 顯示 這是一個函數... 修改后顯示 ...這是一個函數 /* 根據Function對象提供的bind()方法進行函數調用 * 參數 this 可以先用 null 站位 * 兩個函數之間不會有影響 */ var fn = fun.bind( null, "這還是一個函數", "..." ); fn();// 顯示 這還是一個函數...重載
表示定義多個同名的函數,但每個函數可接收的參數不同
在調用時會進行判斷,函數會根據形參可接收的個數去匹配傳入實參個數相同的
注意在JavaScript的函數中不存在重載
當函數同名時,最后一次定義的函數有效
/* 重載現象 */ function fn( a, b ){ return a + b; } function fn( a, b, c ){ return a + b + c; } function fn( a, b, c, d ){ return a + b + c + d; } /* 重載的正常顯示 */ fn( 1, 2 );// 顯示 3 fn( 1, 2, 3 );// 顯示 6 fn( 1, 2, 3, 4 );// 顯示 10 /* JavaScript中的顯示結果 */ console.log( fn( 1, 2 ) );// 顯示 NaN console.log( fn( 1, 2, 3 ) );// 顯示 NaN console.log( fn( 1, 2, 3, 4 ) );// 顯示 10arguments對象
該對象可以獲取當前指定函數中的所以參數(實參),并存儲到一個類數組中
該對象只能在函數中使用
length屬性 - 表示函數中參數的個數
該方法可以模擬實現函數的重載
function fun(){ /* 通過length屬性獲取函數參數的個數 */ var add = arguments.length; /* 再通過條件語句進行判斷 */ switch ( add ) { /* 根據參數的個數進行顯示 */ case 2: /* 由于arguments對象將獲取到的參數儲存到一個類數組中,可以使用數組的方式進行提取 */ return arguments[0] + arguments[1]; break; case 3: return arguments[0] + arguments[1] + arguments[2]; break; case 4: return arguments[0] + arguments[1] + arguments[2] + arguments[3]; break; } } /* 可以模擬出重載的效果 */ console.log( fun( 1, 2 ) );// 顯示 3 console.log( fun( 1, 2, 3 ) );// 顯示 6 console.log( fun( 1, 2, 3, 4 ) );// 顯示 10遞歸
表示在一個函數中,調用自身
注意如果不給遞歸設置一個出口,會出現類似于循環語句中的 死循環
解決通過在遞歸的過程中不斷改變數據值
在進行條件判斷來設置出口
利用return語句的結束效果,結束遞歸
arguments對象的callee屬性該屬性表示當前正在執行的函數
function fun() { console.log( "啊哈哈" ); /* 調用自身函數 - 實現遞歸 * 會出現類似于循環語句中的 死循環 */ fun(); } fun(); /* 可以設置一個循環出口 */ function fn( a ) { console.log( a ); /* 通過條件判斷來設置出口 */ if ( a >= 10 ) { /* 利用return語句的結束效果,結束遞歸 */ return; } /* 在遞歸的過程中不斷改變數據值 */ fn( a + 1 ); } /* 傳入一個數值用于條件判斷 */ fn( 0 ); /* 如果將遞歸函數賦值個一個變量,再將遞歸函數清空釋放,在去執行變量會出錯 */ function fu( b ) { console.log( b ); if ( b >= 10 ) { return; } /* 新函數(s)在執行時,內部的函數體,依然是舊函數(fu)的 當執行到改變數據值時,調用的目標依舊是舊函數(fu)而沒有更改成新函數(s) 所以會報錯 - TypeError: fu is not a function 可以通過arguments對象的callee屬性去替換函數名 arguments對象的callee屬性 * 該屬性表示當前正在執行的函數 */ // fu( b + 1 ); /* 修改后在執行就可正常顯示 */ arguments.callee( b + 1 ); } fu( 0 ); /* 將遞歸函數賦值個一個變量 */ var s = fu; /* 將遞歸函數清空釋放 */ fu = null; /* 使用函數方式執行變量 */ s( 0 ); /* 會報錯 */ console.log( s );// 顯示 fu is not a function匿名函數
表示定義一個沒有函數名的函數
匿名函數的用法
將匿名函數作為參數傳遞給其他函數
這種方法也可以叫做 回調函數
將匿名函數用于執行一次性任務
這種方法也可以叫做 自調函數
/* 創建一個匿名函數 */ function (){ console.log( "啊哈哈" ); }回調函數
表示一個函數做為參數傳入到另一個函數中
/* 定義一個函數 - 該函數做為另一個函數的參數 */ var fn = function () { return 10; } /* 定義另一個函數 */ var fun = function ( f ) { /* 傳進該函數體中的是一個函數,可以直接調用 */ return f(); } /* 當前函數的參數為另一個函數 */ var s = fun( fn ); console.log( s );// 顯示 10自調函數
表示在定義函數后自行調用
用法
第一種 - 兩個小括號
第一個小括號 - 定義匿名函數
第二個小括號 - 調用
/* 第一種方法 */ (function(){ console.log( "啊哈哈" ); })();
第二種 - 一個小括號中包含另一個小括號
第一個小括號 - 定義匿名函數
第二個小括號(被包含的) - 調用
/* 第二種方法 */ (function(){ console.log( "呀吼吼" ); }());
第三種 - 嘆號 + 小括號
嘆號后寫匿名函數
小括號 - 調用
/* 第三種方法 */ !function(){ console.log( "哦哦哦" ); }();作為值的函數
表示一個函數做為另一個函數的返回值
function fun() { var s = 10; return function () { return s; } } console.log( fun()() );// 顯示 10作用域鏈
表示函數作用域有權限訪問除自身內部的函數作用域之外的其他作用域
并且會把次特性傳遞個自身內部的函數作用域
var a = 100;// 全局變量 function fun1(){ var b = 200;// fun1函數作用域的局部變量 // 內部函數 function fun2(){ var c = 300;// fun2函數作用域的局部變量 // 內部函數 function fun3(){ var d = 400;// fun3函數作用域的局部變量 // 調用變量 console.log(a);// 100 console.log(b);// 200 console.log(c);// 300 console.log(d);// 400 } fun3(); // 調用變量 // console.log(a);// 100 // console.log(b);// 200 // console.log(c);// 300 // console.log(d);// d is not defined } fun2(); // 調用變量 // console.log(a);// 100 // console.log(b);// 200 // console.log(c);// c is not defined // console.log(d);// d is not defined } fun1();閉包理論
表示在全局作用域可以訪問到函數作用域中的數據
作用域的逆向操作(個人理解)
/* 定義一個全局變量但不賦值 */ var s; function fun(){ var v = 100; /* 在函數作用域中對全局變量進行賦值 */ s = function(){ console.log(v); } s(); } fun();// 顯示函數體的內容 100 /* 訪問全局變量會得到在函數作用域中數值 */ s();// 顯示全局變量的值 100
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108222.html
摘要:那你們肯定會問為什么共用,而沒有共用呢,下面就給你解釋,請看引用類型是共用的值類型是私用的。 引言 面向對象的編程語言都具繼承這一機制,而 JavaScript 是基于原型(Prototype)面向對象程序設計,所以它的實現方式也是基于原型(Prototype)實現的. 繼承的方式 類式繼承 構造函數繼承 組合繼承 原型式繼承 寄生式繼承 寄生組合式繼承 1.類式繼承 //聲明父...
摘要:之面向對象總結前言在中是沒有類的概念的,所以它的對象與基于類的語言中的對象不同。一理解對象張三上面通過構造函數創建了一個對象,并為它添加了三個屬性。 JavaScript之面向對象總結 前言:在ECMAScript中是沒有類的概念的,所以它的對象與基于類的語言中的對象不同。ECMA-262把對象總結為:無序屬性的集合,其屬性包含基本值、對象或者函數。 一、理解對象 var person...
摘要:應該非常小心,避免出現不使用命令直接調用構造函數的情況。上面代碼表示,使用屬性,確定實例對象的構造函數是,而不是。當然,從繼承鏈來看,只有一個父類,但是由于在的實例上,同時執行和的構造函數,所以它同時繼承了這兩個類的方法。 基本概念 類和實例是大多數面向對象編程語言的基本概念 類:類是對象的類型模板 實例:實例是根據類創建的對象但是,JavaScript語言的對象體系,不是基于類的,...
摘要:一類型概述與函數函數聲明方式字面量方式判斷函數是否為類型中所有函數都是類型的對象創建類型的對象是個函數函數名參數函數體由于函數的參數和函數體都是以字符串形式傳遞給以函數方式進行調用屬性定義一個構造函數犬夜叉使用構造函數創建對象對象具有與構 JS(JavaScript) 一.Function類型概述1.Function與函數; // 函數聲明方式 function fun(){ ...
摘要:簡單回顧一下構造函數原型和實例對象之間的關系每個構造函數都有一個原型對象。找到生成構造函數的原型對象的構造函數,搜索其原型對象,找到了。 JS面向對象的程序設計之繼承的實現 - 原型鏈 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯誤,會非常感謝您的指出。文中絕大部分內容引用自《JavaS...
摘要:面向對象的程序設計之繼承繼承的實現借用構造函數前言最近在細讀高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。繼承了注意,這一段代碼借調了超類型的構造函數。 JS面向對象的程序設計之繼承-繼承的實現-借用構造函數 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下...
閱讀 1298·2021-11-16 11:44
閱讀 3766·2021-10-09 10:01
閱讀 1750·2021-09-24 10:31
閱讀 3845·2021-09-04 16:41
閱讀 2516·2021-08-09 13:45
閱讀 1216·2019-08-30 14:08
閱讀 1779·2019-08-29 18:32
閱讀 1644·2019-08-26 12:12