Javascript函数评估

Javascript function evaluation

本文关键字:评估 函数 Javascript      更新时间:2023-09-26

>我把函数声明为:

function test(id, name) { 
  return id + "*-----*" + name
}

所以当我这样做时test(2,"Bob")我得到这个:

"2*-----*Bob"

但是当我声明数组时,例如:

a = [2, "Bob"]

并将这些参数注入到函数中,如下所示:

test(a.join(','))

我得到这个:

"2,Bob*-----*undefined"

这不是我想要的。为什么会这样解释?如何让它从我拥有的数组输出"2*-----*Bob"

test.apply(null,a)会将数组a发送到函数并使数组元素成为函数参数。 也就是说,a[0] 将是第一个函数参数,a[1] 将是第二个参数,依此类推,但您的函数只有两个参数。

有关此内容的更多信息,请阅读 The Mozilla Docs for Function.apply

a.join(',')将连接数组,从而产生类似"2,Bob "的字符串。您必须分别传递这两个变量,例如:

test(a[0], a[1]);

a.join(',')给你一个字符串,所以你用一个字符串("2,Bob")调用你的函数test,第二个参数是undefined

如果要允许数组作为参数,可以这样做:

function test(id, name) { 
    if (id.length > 1)
        return id[0] + "*-----*" + id[1]
    else
        return id + "*-----*" + name
}

我认为你只将一个参数传递给需要两个参数的函数

尝试

test(a.join(','), "foo");
test(a.join(','))

这会将一个参数传递到函数中,即一个带有逗号的字符串。 对于 x 的任何值,test(x) 将始终只将一个参数传递到函数中。

希望它像你写test(2,"Bob")一样工作,但Javascript不是在编写和递归评估自己!您期望:

  1. a.join()返回一个字符串并将其写入源代码。
  2. 读取并执行生成的源代码。

它的实际工作方式:

  1. 读取并执行源代码。
  2. a.join()返回一个值,该值用作test()的输入。

要将数组中打包的参数传递给函数,您需要apply()

function test(id, name) { 
  return id + "*-----*" + name
}
var a = [2, "Bob"];
var result = test.apply(null, a); // See below
alert(result);

apply的第一个参数将在函数内变为"this",第二个参数是实际的值数组。