函数申明

  • 必须有函数名
function func(){}

函数申明如果呈现在表达式的地位,则被转化为函数表达式

// 圆括号(分组操作符)内只能是表达式(function foo() {}); // 在数组只能是表达式[function bar() {}]; // 逗号也只能操作表达式1, function baz() {};const obj = {  aa: function Inner() {    return '123'  }()}console.log(obj);
  • 函数申明会晋升
func();function func(){}

函数表达式

  • 函数名可选
const func = function(){}const func2 = function Inner(){  console.log(Inner);}console.log(Inner);

命名的函数表达式,函数名在内部是有效的,只能在函数外部应用。

面试题

var a = 100;if (function b() { }) {      a += typeof (b);}console.log(a);
  • 函数表达式不存在变量晋升

实参和形参

  • 函数的实参个数 arguments.length;
  • 函数的形参个数 funcName.length;
function Test(a){  console.log(arguments.length, '实参');  console.log(Test.length, '形参');}Test(1,2)

实参 arguments[0],形参 a,尽管它们的存储地位是不同的,然而它们是一一隐射关系,一一映射的要害,是须要实参传值,如果不传值,则无奈建设关系,有一一映射关系时,批改形参时,实参也会被批改,否则不会。

function Test(a){  a =100;  console.log(arguments);}Test(1,2)function Test(a,b){  b =100;  console.log(arguments[1]);}Test(1)
  • 形参的默认值是 undefined
  • 当实参为undefined,则取值形参;当形参为undefined,则取值实参;当都为undefiend,则为 undefined

    function Test(a,b){console.log(a,b);}// 下面的代码等于上面的代码function Test(a=undefined,b=undefined){console.log(a,b);}Test(1,2)function Test1(a = 10,b){console.log(a,b);}Test1(undefined,2)