Javascript function一個階段的學習總結
1.函式是物件
在ECMAscript中,所有的函式都是function類所例項化的物件,而且都與其他引用型別一樣具有屬性和方法。函式是物件,因此函式名只是一個指向函式的指標,不會與函式繫結。也就是說一個函式可以有多個名字,這是沒問題的。
function sum(num1,num2){ return num1+num2 } console.log(sum(12,10)) var anotherSum = sum; console.log(anotherSum(10,10)) sum = null; console.log(anotherSum(220,10))
2.沒有過載
什麼是過載
方法過載是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的引數列表,即引數的數量或引數型別不能完全相同。
方法重寫是存在子父類之間的,子類定義的方法與父類中的方法具有相同的方法名字,相同的引數表和相同的返回型別。
但是在ECMAScript中,函式不介意傳遞進來多少個引數,也不介意引數是什麼資料型別,也就是說,即便你定義的函式只接收兩個引數,在呼叫這個函式時也未必一定要傳遞兩個引數,可以傳遞一個、三個甚至是不傳引數。之所以會這樣,原因是ECMA中引數在內部用一個數組表示的。函式接收到的始終是這個陣列,而不關心陣列中有哪些引數。
function addSomeNumber(num){
return num+100;
}
function addSomeNumber(num,num2,num3,num4,numn){//即便這個函式的引數個數不一樣也會覆蓋上個同名函式
return num+200;
}
var result = addSomeNumber(100)
console.log("result:"+result) //result:300
function addSomeNumber(num){
return num+100;
}
function addSomeNumber(){
return arguments[0]+200;
}
var result = addSomeNumber(100)
console.log("result:"+result)
3.作為值的函式
因為ECMAScript中的函式本身就是變數,所以函式也可以作為值來使用。也就是說函式可以被傳遞給另一個函式當引數,
function callSomeFunction(someFunction, someArgument) {
return someFunction(someArgument)
}
function add10(num) {
return num + 10;
}
var result = callSomeFunction(add10, 10);
console.log(result); // 20
function getGreeting(name) {
return "Hello," + name;
}
var result1 = callSomeFunction(getGreeting, 'Andy');
console.log(result1);// Hello,Andy
也可以將一個函式作為另一個函式的結果返回。 這也是一種極為有用的技術。例如,假設有一個物件陣列,我們想要根據某個物件屬性對陣列進行排序。而傳遞給陣列sort()方法的比較函式要接收兩個引數,即要比較的值。可是我們需要一種方式來指明按照哪個屬性來排序。可以定義一個函式,它接收一個屬性名,然後根據這個屬性名來建立一個比較函式。
function createComparsionFunction(propertyName) {
return function (object1, object2) {
var value1 = object1[ propertyName ];
var value2 = object2[ propertyName ];
if (value1 < value2) {
return -1;
}
else if (value > value2) {
return 1;
}
else {
return 0;
}
};
}
var data = [{name:"Zachary",age:28},{name:"Nicholas",age:29}];
data.sort(createComparsionFunction("name"));
console.log(data[0].name);
data.sort(createComparsionFunction("age"));
console.log(data[0].age);
4.函式內部的屬性
arguments、this
arguments是一個類陣列物件(陣列的弟弟),包含著傳入函式中的所有引數。 https://blog.csdn.net/qq_16339527/article/details/53231725←我抄他的= _=
arguments的callee屬性:儲存著這個arguments所在函式的程式碼
function showcallee() {
var a = '這裡是程式碼';
var b = '這是另一段程式碼';
var c = a + b;
console.log(arguments.callee);
return c;
}
showcallee();
this是引用當前函式的執行環境 高程三p114
5.函式的屬性和方法
每個函式都包含兩個屬性:length和prototype
每個函式都包含兩個非繼承而來的方法:apply和call
https://blog.csdn.net/weixin_42519137/article/details/83823855
6.閉包