[js點滴]JavaScript關於函式總結
阿新 • • 發佈:2019-01-01
/*1.函式的概念
函式就是實現某一功能的程式碼片段.
2.函式的分類
a.預定義函式(系統函式)
b.自定義函式
函式又稱之為方法
3.函式定義
function 函式名(引數1,引數2,引數3,...){
函式主體
}
注意兩點:
a.function為關鍵字,用來定義函式;
b.函式名必須是唯一的.
4.函式的寫法:
*/
// 4.1 function 關鍵字寫法
function test(){
console.log("12343" );
}
// 4.2 函式表示式寫法(匿名函式),採用變數賦值的寫法
var fun = function(){
console.log("xasc");
};
/* 注意:
1.賦值語句的等號右側只能放表示式,這種寫法是將匿名函式賦值給變數.
2.採用函式表示式寫法,function後面不能帶有函式名,如果加上函式名,該函式名只在函式主體內部有效
3.函式表示式語句後面要加上分號.
var fun1 = function func(){
alert(typeof func);
console.log("xasc");
};
fun1();
alert(typeof func);
*/
//4.3 Function建構函式建立函式物件
var test = new Function(
'x',
'y',
'return (x+y)'
)
//等價於
function test1(x,y){
return x+y;
}
/*解釋:
1.Function建構函式裡面三個引數,第1,2個引數表示引數,第3個引數表示函式的實現主體
2.該種寫法非常不直觀,幾乎無人使用這種寫法
*/
//5.函式的重複定義
function t1(){
console.log("t1");
}
t1();//t2
function t1(){
console.log("t2" );
}
t1();//t2
/*注意:
如果兩個函式的函式名一樣,後一次的函式定義會覆蓋前一個函式定義,由於存在函式名的提升,前一次定義在任何時候都是無效的.
*/
//6.函式呼叫
function t2(){
}
t2();//表示函式的呼叫
function t3(a,b){
return a+b;
}
t3(1,2);//有參函式的呼叫
//7.函式名的提升
/*在js當中,把函式名等視為變數名,所以一般採用function來定義(第一種方式定義的函式)的函式,整個函式會像變數定義一樣,被提升到程式碼的頭部.
*
*/
funct();
function funct(){
console.log("adas");
}
/*解釋:
funct()在函式的定義之前進行了呼叫,由於該種方法定義的函式存在函式名的提升,函式funct會自動提升到程式碼的頭部,也就是在呼叫之前已經聲明瞭.
fu();//函式的呼叫 fu is not a function
var fu = function() {
console.log("fu");
}
*/
//8.如果採用function和函式表示式形式來定義同一個函式,最後總是採用函式表示式形式定義的函式
var fus = function(){
console.log("aaaa");
}
function fus(){
console.log("bbbb");
}
fus();//aaaa
//9.ECMA規定,不得在非函式的程式碼塊中定義函式,如:在if或者try語句中
/*if(false){
function fus2(){
console.log("123");
}
}
fus2();
*/
//10.函式的屬性
var s = function(){
console.log("xs");
}
function ss(){
}
//10.1 name屬性 返回函式function後面的函式名.
console.log(s.name);//""
console.log(ss.name);//"ss"
//10.2 length 屬性 返回的是定義函式時引數的個數.
function sss(a,b,c){
}
sss(1,2);
sss.length;//3
//10.3 函式toString() 以字串形式返回函式的原始碼
//function ssss(){
// //返回值
// return "ABC";
//}
//ssss.toString();
//"function ssss(){\
// //返回值\
// return "ABC";\
//}\
//"
//注意:函式中的註釋也會輸出出來
//11.函式內部的變數提升
function add(x){
if(x>0){
var temp = x+100;
}
}
/*相當於
function add(x){
var temp;
if(x>0){
temp = x+100;
}
}
注意:與全域性變數一樣,函式內部的變數,也會發生一個變數名的提升現象,var 宣告的變數,無論在函式內什麼位置,變數名都會提升到函式體的頭部.
*/
//12.函式的作用域
var sub = function(){
function sub1(){
console.log("sub1");
}
}
//sub1();//訪問不到,sub1是區域性變數,可見範圍只在它所在的父級區域
//13.函式的引數
function s10(a,b){
return a+b;
}
var result = s10(2,12);
/*
注意:
1.a,b是s10函式的兩個引數,且引數前面不能加var.
2.在js當中函式的引數不是必須的,在呼叫時允許省略
3.在js中呼叫函式時,無論提供多少個引數,都不會報錯的
4.在js中如果呼叫函式時,想少傳一個引數,則需要把不傳的那個引數設定成undefined,例如:s11(undefined,23)
*/
s10(12,13);//25
alert(s10(12,23,12,14));//35
s10();//undefined
s10.length;//2
function s11(a,b){
return b;
}
alert(s11(undefined,23));//正常 23
//14.為函式引數設定預設值
function s14(a){
a = a || 1;
return a;
}
alert(s14(10));
//15.同名引數
//1.同名引數,取最後引數出現的那個值
//2.如果引數都是b,則以後面的引數b為準,即使後面b沒有值或值被省略,依舊以最後一個引數為準
function s15(b,b,b){
console.log(b);
}
s15(12);//這裡省略了後面的兩個引數,所以b的取值為undefined.
/*
16.arguments物件
1.由於js中允許函式有不定數目的引數,為了讓這些引數不丟失,所以這些引數全部儲存在arguments物件裡面
2.arguments包含了程式執行時的所有引數,arguments[0]第一個引數,arguments[1]第二個引數,以此類推.
*/
//閉包函式
function fun1(){
var n = 1000;
function fun2(){
console.log(n);
}
return fun2;
}
var res1 = fun1();
res1();
/*解釋:函式fun1返回值是fun2函式, fun2函式中可以讀取到fun1中的變數n,所有在外部就可以獲得fun1函式中的變數n了.
閉包就是函式fun2,也就是能夠讀取其他函式中的變數的函式.
閉包的定義:就是定義在函式內部的函式,它的本質就是將函式內部與函式外部連線在一起的一個橋樑.
*/
function fun3(a){
function fun4(b){
return a++;
}
return fun4;
}
var f = fun3(12);
var s1 = f(0);//12
var s2 = f(0);//13
var s3 = f(0);//14
//閉包函式的兩個作用:
//1.可以讀取函式內部的變數
//2.讓這些變數始終儲存在記憶體中,一直存在.
/*缺點:
記憶體消耗很大,會造成網頁效能問題
*/
// 立即執行函式
//1.常規方法
// function(){
// console.log("123");
// }
// f();//函式呼叫
// 2.立即呼叫函式表示式
//(function(){})();
// 或者
// (function(){}());
// 注意:最後一個圓括號,是向內部傳遞引數用的
(function(){
console.log("123");
})();
//2.eval()將字串當做語句執行
eval('var a = 13');//相當於var a = 13;
alert(a);//13
var b = 14;
eval('b = 15');//a = 15
alert(b);//15
// var tr = function(a,b){
// return a+b;
// }
// tr(12,13);
(function(a,b){
return a+b;
}(12,13));