声明

  • var变量声明,通俗来说会将变量上升到上级代码块的变量范围中。这里的上级代码块详细来说应该是当前函数作用域或者全局作用域,因为在 JavaScript 里,只有函数全局作用域能够限制var变量的作用域,像if语句、for循环、while循环等代码块是无法限制的。
    比如:
    无法限制var作用域的情况:

    1
    2
    3
    4
    if(true){
    var x = 5;
    }
    console.log(x);//x的值为5

    可以限制var作用域的情况:

    1
    2
    3
    4
    5
    6
    7
    8
    function example() {
    if (true) {
    var x = 5; // 实际上会被提升到函数顶部
    }
    console.log(x); // 可以访问 x,输出 5
    }

    console.log(x); // 报错:ReferenceError(x 不在全局作用域,因为function将其限制)

函数

函数定义与声明

二者区别

函数声明(Function Declaration)

1
2
3
function add(a, b) {
return a + b;
}
  • 特点

    • function关键字开头,后跟函数名。
    • 函数提升(Hoisting):可以在定义前调用(JavaScript 引擎会将函数声明提升到当前作用域的顶部)。
    • 独立语句:不能嵌套在非代码块中(如if语句、赋值语句)。
  • 示例

    1
    2
    3
    4
    console.log(add(2, 3)); // ✅ 可以在定义前调用
    function add(a, b) {
    return a + b;
    }

2. 函数表达式(Function Expression)

1
2
3
const add = function(a, b) {
return a + b;
};
  • 特点

    • function关键字开头(匿名函数),或使用具名函数表达式(如function add(a, b))。
    • 赋值给变量:函数是一个值,存储在变量add中。
    • 没有函数提升:必须在定义后调用(变量提升但值为undefined)。
  • 示例

    1
    2
    3
    4
    console.log(add(2, 3)); // ❌ 报错:add is not a function
    const add = function(a, b) {
    return a + b;
    };

3. 箭头函数(Arrow Function)

1
const add = (a, b) => a + b;
  • 特点

    • 更简洁的语法:使用=>符号,省略function关键字。
    • 隐式返回:单行表达式无需return关键字(如(a, b) => a + b)。
    • 没有自己的this:继承自父作用域(适合回调函数)。
    • 不能使用arguments对象:不绑定arguments变量。
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 完整语法
    const add = (a, b) => {
    return a + b;
    };

    // 隐式返回
    const double = num => num * 2;

    // 无参数
    const greet = () => "Hello!";

箭头函数是函数表达式的一种吗?

是的!