JavaScript函数参数传递策略:严格与非严格

需积分: 0 0 下载量 46 浏览量 更新于2024-08-30 收藏 93KB PDF 举报
"深入理解JavaScript系列的第19章,主要探讨了JavaScript中函数参数的求值策略,即参数传递的方式。文章指出,虽然许多程序员认为JavaScript中对象按引用传递,原始值按值传递,但真正的理解并不普遍。文中提到了两种基本的赋值策略:严格和非严格,并详细讲解了ECMAScript中采用的严格策略以及其子策略。此外,还讨论了参数计算的顺序,以及按值传递的概念,通过伪代码帮助理解参数传递过程中值的拷贝和独立性。" 在计算机科学中,求值策略是编程语言中决定表达式何时和如何计算的规则。在JavaScript和其他一些语言如C、Java、Python和Ruby中,参数传递采用了严格的策略,意味着在函数调用时,参数会被立即计算并复制其值。这种策略确保了函数内部对参数的修改不会影响到外部环境中的原始值。 按值传递是最常见的参数传递方式之一,它涉及到将调用者提供的值的一个副本传递给函数。这意味着,如果参数是一个原始值(如数字或字符串),那么在函数内部改变参数的值不会影响到函数外部的原始值。例如: ```javascript function testByValue(a) { a = a + 1; } let num = 5; testByValue(num); console.log(num); // 输出: 5 ``` 在这个例子中,`num`的值在函数内部被增加,但因为是按值传递,函数外部的`num`并未受到影响。 然而,当参数是对象时,情况变得复杂。尽管JavaScript对象看似按引用传递,但实际上传递的是对象的引用副本,而不是对象本身。这意味着,尽管对象的值在函数内部可以被修改,因为是修改的同一个引用指向的内存区域,所以外部的引用也会反映出这些变化: ```javascript function testByReference(obj) { obj.value = obj.value + 1; } let obj = { value: 5 }; testByReference(obj); console.log(obj.value); // 输出: 6 ``` 在这里,尽管对象`obj`的引用被传递,但是由于对象属性的修改是针对同一个内存位置,所以函数外部的`obj`也会显示修改后的值。 除了按值传递,还有按引用传递(通常在非严格策略中出现),在某些语言中,参数是原始引用的副本,而非其值的副本。这会导致函数内部对参数的修改影响到外部环境。但JavaScript不支持这样的按引用传递,它的行为更接近于"按共享值"传递,对于对象来说,是共享对同一内存区域的引用。 总结起来,深入理解JavaScript的求值策略,特别是参数传递的机制,对于编写高效和无副作用的代码至关重要。通过掌握这些概念,开发者能够更好地预测和控制函数对数据的影响,从而写出更加健壮的代码。