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

时间:2014-03-04 21:56:00

标签: javascript

观察:

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会以这种方式运行?

3 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:5)

尝试在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];
}

答案 2 :(得分:3)

这是the spec

的一部分
  

对于非严格模式函数,数组索引(在15.4中定义)命名   数据名称值为的参数对象的数据属性   小于相应的形式参数的数量   函数对象最初与相应的共享它们的值   函数执行上下文中的参数绑定。 这意味着   更改属性会更改参数的相应值   绑定,反之亦然。如果发生这种情况,这种通信就会被打破   删除属性,然后重新定义或更改属性   进入一个访问者财产。对于严格模式函数,其值为   arguments对象的属性只是参数的副本   传递给函数,之间没有动态联系   属性值和形式参数值。

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