函数
基础知识
- 标准语法是使用函数声明来定义函数
- 标准声明的函数优先级更高,解析器会优先提取函数并放在代码树顶端,
- 所以标准声明函数位置不限制,所以下面的代码可以正常执行。
- 标准声明优先级高于赋值声明
new Function("title", "console.log(title)");
function funA() {
return 'funA'
}
const funB = function () {
return 'funB'
}
let ObjA = {
funC(value) {
this.name = value;
}
}
私有作用域
- 以前为了防止污染全局会使用私有作用域
- 在第三方包使用立即执行函数
- 使用 {} 和 let 构建
(function (window) {
function funA() {
return 'funA'
}
window.baoName = { funA }
})(window);
{
const funB = function () {
return 'funE'
}
window.baoName = { funB }
}
展开语法
- 展示语法或称点语法体现的就是收/放特性,做为值时是放,做为接收变量时是收。
- 也可以用于接收部分参数,多个参数时...参数必须放后面
function funA(site, ...args) {
console.log(site, args);
}
funA("萧俊介", 1, 2, 3);
arguments
- arguments 接收函数所有传递过来的参数
- arguments 是一个对象,可以直接循环操作
- 但是如果想调用数组的方法需要用 [...arguments] 转成数组
- 所以不如直接使用点语法接收变量
function funA() {
return [...arguments].reduce((total, num) => {
return (total += num);
}, 0);
}
function funB(...args) {
return args.reduce((a, b) => a + b);
}
箭头函数
- 箭头函数是函数声明的简写形式,在使用递归调用、构造函数、事件处理器时不建议使用箭头函数。
- 无参数时使用空扩号即可,函数体为单一表达式时不需要 return 返回处理,系统会自动返回表达式计算结果。
- 多参数传递与普通声明函数一样使用逗号分隔,只有一个参数时可以省略括号
- 箭头函数没有 this, 也可以理解为箭头函数中的 this 会继承定义函数时的上下文,可以理解为和外层函数指向同一个 this。
- 如果想使用函数定义时的上下文中的 this,那就使用箭头函数
递归调用
- 递归指函数内部调用自身的方式。
- 主要用于数量不确定的循环操作
- 要有退出时机否则会陷入死循环
function funA(num = 3) {
return num == 1 ? num : num * funI(--num);
}
funI(5);
回调函数
- 在某个时刻被其他函数调用的函数称为回调函数,比如处理键盘、鼠标事件的函数。
<button id='hd'>button</button>
document.getElementById('hd').addEventListener('click', () => alert('通过回调函数调用'));
this
- 调用函数时 this 会隐式传递给函数 指函数调用时的关联对象,也称之为函数的上下文。
- 函数调用:全局环境下 this 就是 window 对象的引用,使用严格模式时在全局函数内 this 为 undefined
- 方法调用:函数为对象的方法时 this 指向该对象,不属于对象方法所以指向 window
apply / call / bind
- 构造函数中的 this 默认是一个空对象,然后构造函数处理后把这个空对象变得有值。
- 可以改变构造函数中的空对象,即让构造函数 this 指向到另一个对象。
function show(title) {
alert(`${title + this.name}`);
}
let lisi = {name: '李四'};
show.call(lisi, 'call');
show.apply(lisi, ['apply']);
let newFunc = show.bind(lisi, 'bind');
newFunc()