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

函数声明

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

你可能感兴趣的:(javascript)