返回

深入浅出剖析 JavaScript 函数传参的玄机

前端

一、JavaScript 函数传参的本质
在 JavaScript 中,函数传参传递的不是参数本身,而是参数的拷贝。这也就意味着,函数内部对参数所做的任何修改都不会影响到函数外部的参数。

二、基本数据类型和引用数据类型
在 JavaScript 中,数据类型主要分为两大类:基本数据类型和引用数据类型。基本数据类型包括数字、字符串、布尔值、undefined 和 null。引用数据类型包括对象、数组和函数。

  1. 基本数据类型
    对于基本数据类型,函数传参传递的是参数的拷贝。这意味着,函数内部对参数所做的任何修改都不会影响到函数外部的参数。例如:
function changeNumber(num) {
  num++;
}

let a = 10;
changeNumber(a);
console.log(a); // 输出:10

在这个例子中,changeNumber 函数接收一个数字参数 num,并将其加 1。但是,由于传递的是 num 的拷贝,所以函数内部对 num 所做的修改不会影响到函数外部的 a。

  1. 引用数据类型
    对于引用数据类型,函数传参传递的是参数的引用。这意味着,函数内部对参数所做的任何修改都会影响到函数外部的参数。例如:
function changeArray(arr) {
  arr.push(10);
}

let a = [1, 2, 3];
changeArray(a);
console.log(a); // 输出:[1, 2, 3, 10]

在这个例子中,changeArray 函数接收一个数组参数 arr,并向其中添加一个元素 10。由于传递的是 arr 的引用,所以函数内部对 arr 所做的修改会影响到函数外部的 a。

三、闭包与作用域
在 JavaScript 中,闭包是指能够访问另一个函数作用域中变量的函数。闭包可以用来实现一些有趣的功能,例如:

  1. 私有变量
    通过闭包,我们可以实现私有变量,即只能在函数内部访问的变量。例如:
function createCounter() {
  let count = 0;

  return function() {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // 输出:1
console.log(counter()); // 输出:2
console.log(count); // 报错:count is not defined

在这个例子中,count 是一个私有变量,只能在 createCounter 函数内部访问。

  1. 延迟执行
    闭包还可以用来实现延迟执行。例如:
function delay(ms, callback) {
  setTimeout(callback, ms);
}

delay(1000, () => {
  console.log('延迟执行');
});

在这个例子中,delay 函数通过 setTimeout 函数延迟执行 callback 函数。

四、结语
JavaScript 函数传参的机制看似简单,但其中却蕴藏着许多奥秘。通过深入理解函数传参的本质、基本数据类型和引用数据类型、闭包与作用域等概念,我们可以更好地理解和掌握 JavaScript 这门编程语言。