学习笔记——函数声明和函数表达式

函数声明

  • 必须有函数名
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)

    推荐阅读