函數(shù)
JavaScript的核心楣责,JavaScript的核心,JavaScript的核心,重要的事情說三遍
函數(shù)定義
function 函數(shù)名字(參數(shù)1, 參數(shù)2, ...) {
函數(shù)體,執(zhí)行的語句
return 返回值 //return語句可以不寫旨涝,不寫默認返回undefined
}
函數(shù)參數(shù)
- 函數(shù)參數(shù)只在函數(shù)范圍內(nèi)有效;
let number = 3;
function addOne(number) {
number++;
console.log(number);
}
addOne(number); // 4
console.log(number); //3
- 函數(shù)參數(shù)為對象類型時侣背,要注意白华,函數(shù)內(nèi)的修改會對外部有影響的;
let obj = { age: 10 };
function changeAge(a) {
a.age++;
console.log(a.age);
}
changeAge(obj); // 11
console.log(obj.age); //11
JavaScript中基本類型傳遞到函數(shù)里時贩耐,是對原始值的復(fù)制弧腥,如果是對象傳遞的是函數(shù)的引用
- JavaScript沒有函數(shù)重載問題,你傳遞參數(shù)多了少了潮太,調(diào)用的都是同一個函數(shù)管搪;
參數(shù)解構(gòu)
這個和之前說的對象的解構(gòu)是一樣的,你傳給函數(shù)的參數(shù)铡买,也會按照之前講的解構(gòu)來解析參數(shù)更鲁;
function sayHello({name, message}) {
return `${name}, ${message}`;
}
sayHello({name: 'a', message: 'hello.'}); // a, hello.
參數(shù)中可以使用展開操作符,但是必須是最后一個參數(shù)
function addNames(name1, ...names) {
let arr = [];
arr.push(name1);
for (let i in names) {
arr.push(names[i]);
}
console.log(arr);
}
addNames('a', 'b', 'c'); // a,b,c
默認參數(shù)
函數(shù)的參數(shù)可以給一個默認的值寻狂,如果不賦值岁经,則默認為undefined
this關(guān)鍵字
this是函數(shù)體內(nèi)的只讀字段朋沮;this具體指的是什么蛇券,由方法如何被調(diào)用決定。
箭頭函數(shù)
- 可以省略function樊拓;
- 只有一個參數(shù)時纠亚,可以省略括號;
- 如果只有一個表達式時筋夏,可以省略大括號蒂胞;
const f1 = function() { console.log('f1'); }
const f2 = () => console.log('f2');
const f3 = function(name) { console.log(`hello, ${name}`) }
const f4 = name => console.log(`hello, ${name}`);
函數(shù)指定this
- call, apply, 他倆最大區(qū)別是參數(shù)
const bruce = { name: 'Bruce' };
const madeline = { name: 'Madeline' };
function greet() {
return `Hello, I'm ${this.name}!`;
}
greet();
greet().call(bruce);
greet().call(madeline);
- bind条篷,永久綁定this骗随,再調(diào)用call綁定別的對象蛤织,是不會變的;
function sayHello() {
console.log(`Hello, ${this.name}!`);
}
const mike = { name: 'Mike' };
const jake = { name: 'Jake' };
const bindMike = sayHello.bind(mike);
bindMike(); //Hello, Mike
bindMike.call(jake); //Hello, Mike