函数和声明前置

函数声明和函数表达式的区别

  • 语法不同:
    函数声明定义一个具有指定参数的函数,语法为:
function name([param,[, param,[..., param]]]) {
   [statements]
}

function 关键字可以用来在一个表达式中定义一个函数,语法为:

let function_expression = function [name]([param1[, param2[, ..., paramN]]]) {
   statements
};
  • JavaScript 中的函数声明被提升到了函数定义,你可以在函数声明之前使用该函数;JavaScript中的函数表达式没有提升,不像函数声明,你在定义函数表达式之前不能使用函数表达式
  • 函数表达式与函数声明的最主要区别是函数名称(function name),在函数表达式中可忽略它,从而创建匿名函数(anonymous functions),而函数声明不行

一点点小补充 —— 关于匿名函数

匿名函数书写起来简便快捷,但是有几个缺点需要考虑:

  • 匿名函数在栈追踪中不会显示出有意义的函数名,使得调试很困难
  • 如果没有函数名,当函数需要引用自身时只能使用已经过期的 引用,比如在递归中。另一个函数需要引用自身的例子,是在事件触发后事件监听器需要解绑自身
  • 代码可读性/可理解性变差

变量的声明前置和函数的声明前置

  • 变量的声明前置是指js解析器在解析代码时会将变量的声明提升到当前作用域的最前面,但是变量的赋值还是按照原来的顺序执行。
console.log(a);
var a = 1;

因为存在变量提升, 实际上运行的是如下代码:

var a;
console.log(a);
a = 1; // 最后结果是undefined, 表示变量a已声明而未赋值

注意:

1)变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。
2)提升将影响变量声明,而不会影响其值的初始化
3)变量的声明前置和函数的声明前置,变量在前,函数在后

  • 函数的声明前置有两种:
    一种是函数声明,整个声明都前置到当前作用域的最前面,因此在当前作用域下先调用再声明函数不会报错
    一种是函数表达式,var 一个函数表达式和 var 一个变量没什么区别,因此声明前置的规则与变量声明前置一样

arguments

arguments 是一个对应于传递给函数的参数的类数组对象。在函数内部,可以使用arguments对象获取到该函数的所有传入参数。
arguments对象是所有(非箭头)函数中都可用的局部变量。可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。

函数的"重载"

重载就是一组具有相同名字、不同参数列表的函数(方法)。
在JavaScript中, 没有重载,同名函数会覆盖。但可以在函数体针对不同的参数调用执行相应的逻辑。

function calculate() {
    if (arguments.length == 2) {
        return arguments[0] + arguments[1];
    } 
    if (arguments.length == 3) {
        return arguments[0] * arguments[1] * arguments[2];
    } 
}

calculate(1, 3)

除了上面例子, 还可以以下方法:https://www.cnblogs.com/yugege/p/5539020.html

立即执行函数表达式

立即执行函数表达式是什么

“立即调用的函数表达式”(Immediately-Invoked Function Expression),简称 IIFE,通常有下面两种写法:
(function(){ /* code */ }());
或者
(function(){ /* code */ })();
上面两种写法最后的分号都是必须的 。

立即执行函数表达式作用

  • 不必为函数命名,避免了污染全局变量
  • IIFE 内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。

参考:

  • 浅谈JavaScript函数重载

  • JavaScript中的立即执行函数

  • JavaScript标准参考教程

你可能感兴趣的:(函数和声明前置)