返回

JS语言中的形参实参传递的差异

前端

函数调用中的形参实参传递

当函数被调用时,实际参数(实参)会传递给形式参数(形参)。形参是在函数定义中声明的变量,而实参是实际传递给函数的值。在函数体中,形参代表实参,因此可以对其进行操作。

在JS语言中,形参实参传递是值传递,这意味着传递给函数的是实参的副本,而非引用。当函数修改形参时,不会影响到实参的值。这种传递方式可以防止函数意外修改实参的值,从而提高代码的安全性。

为何传递的对象是传递的副本而非引用

在JS语言中,对象是引用类型,这意味着它们的值是存储在内存中的地址。当将对象传递给函数时,实际上是传递了对象的引用,而非对象本身。因此,函数体中对形参的修改实际上是修改了实参的值。

然而,对于基本类型(如数字、字符串、布尔值),当将它们传递给函数时,实际上是传递了它们的值,而非引用。因此,函数体中对形参的修改不会影响到实参的值。

作用域,变量提升和闭包

作用域是变量可被访问的范围。在JS语言中,作用域有两种:全局作用域和局部作用域。全局作用域是所有代码都可以访问的变量,而局部作用域是函数体内部可以访问的变量。

变量提升是JS语言的一项特性,它会在函数执行之前将所有变量声明提升到函数的顶部。这意味着即使变量在函数体中定义,但实际上它在函数执行之前就已经被声明了。

闭包是函数内部可以访问外部作用域变量的函数。闭包可以用来在函数内部访问外部作用域的变量,从而实现引用传递。

在JS中实现引用传递

在JS语言中,可以通过闭包来实现引用传递。闭包可以用来在函数内部访问外部作用域的变量,从而实现引用传递。

以下是一个实现引用传递的例子:

function modifyObject(obj) {
  obj.property = "new value";
}

var obj = {
  property: "old value"
};

modifyObject(obj);

console.log(obj.property); // "new value"

在这个例子中,modifyObject()函数接受一个对象作为参数。在函数体内,我们修改了形参obj的property属性。由于形参obj是实参obj的引用,因此对形参的修改实际上是修改了实参的值。

垃圾回收

垃圾回收是JS语言的一项特性,它可以自动释放不再使用的内存。垃圾回收机制通过跟踪变量的引用关系来确定哪些变量不再使用了。当一个变量不再被任何其他变量引用时,它就会被垃圾回收机制释放。

垃圾回收机制可以帮助我们避免内存泄漏问题。内存泄漏是指由于变量不再被使用,但仍然被引用而导致的内存浪费。垃圾回收机制可以自动释放不再使用的变量,从而防止内存泄漏的发生。