函数
JavaScript的核心,JavaScript的核心,JavaScript的核心,重要的事情说三遍
函数定义
function 函数名字(参数1, 参数2, ...) {
函数体,执行的语句
return 返回值 //return语句可以不写,不写默认返回undefined
}
函数参数
- 函数参数只在函数范围内有效;
let number = 3;
function addOne(number) {
number++;
console.log(number);
}
addOne(number); // 4
console.log(number); //3
- 函数参数为对象类型时,要注意,函数内的修改会对外部有影响的;
let obj = { age: 10 };
function changeAge(a) {
a.age++;
console.log(a.age);
}
changeAge(obj); // 11
console.log(obj.age); //11
JavaScript中基本类型传递到函数里时,是对原始值的复制,如果是对象传递的是函数的引用
- JavaScript没有函数重载问题,你传递参数多了少了,调用的都是同一个函数;
参数解构
这个和之前说的对象的解构是一样的,你传给函数的参数,也会按照之前讲的解构来解析参数;
function sayHello({name, message}) {
return `${name}, ${message}`;
}
sayHello({name: 'a', message: 'hello.'}); // a, hello.
参数中可以使用展开操作符,但是必须是最后一个参数
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
默认参数
函数的参数可以给一个默认的值,如果不赋值,则默认为undefined
this关键字
this是函数体内的只读字段;this具体指的是什么,由方法如何被调用决定。
箭头函数
- 可以省略function;
- 只有一个参数时,可以省略括号;
- 如果只有一个表达式时,可以省略大括号;
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}`);
函数指定this
- call, apply, 他俩最大区别是参数
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,再调用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