繁体   English   中英

为什么这个JavaScript函数表现得如此奇怪?

[英]Why does this JavaScript function behave so strangely?

注意:

function myFunc(arg1, arg2) {
  if (arguments.length < 2) { // Only one argument received
    arg1 = "Default"; // Set arg1 to some default value
    arg2 = arguments[0]; // Use the first argument passed for arg2
  }
  return [arg1, arg2];
}

myFunc("Hello", "World"); //=> ["Hello", "World"]

// So far, so good. Now let's try one that uses the default value for arg1:

myFunc("World"); //=> ["Default", "Default"]

怎么了,JavaScript? 这里发生了什么? 为什么JavaScript会以这种方式运行?

在使用其值之前,您将覆盖第一个参数:

arg1 = "Default"; // Set arg1 to some default value
arg2 = arguments[0]; // Use the first argument passed for arg2

因此, arg2的值设置为值“Default”而不是原始值。

尝试在if语句中切换逻辑:

function myFunc(arg1, arg2) {
  if (arguments.length < 2) { // Only one argument received
    arg2 = arguments[0]; // Use the first argument passed for arg2
    arg1 = "Default"; // Set arg1 to some default value
  }
  return [arg1, arg2];
}

这是规范的一部分:

对于非严格模式函数,数组索引(在15.4中定义)命名数据属性的参数对象,其数字名称值小于相应函数对象的形式参数的数量,最初与函数的相应参数绑定共享它们的值。执行上下文。 这意味着更改属性会更改参数绑定的相应值,反之亦然。 如果删除并重新定义此属性或将属性更改为存取属性,则此对应关系将被破坏。 对于严格模式函数,arguments对象的属性值只是传递给函数的参数的副本,并且属性值和形式参数值之间没有动态链接。

请注意,如果您"use strict"; ,您的功能将按预期工作"use strict";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM