这个javascript串联对我有用,但这是否总是可以接受的javascript?

时间:2014-04-02 01:11:16

标签: javascript arguments concatenation

在我的一个网站功能( myFunction )中,我需要将四个变量传递给另一个函数(具有通用格式的Ajax函数 - function GeneralFunction (' id1',' id2',param1,param2,param3))。

此时,我需要保留这种通用格式,但 myFunction 有太多参数要传递给 GeneralFunction 。所以我连接如下:

function myFunction(a, b, c, d) {
    //Lots of code then
    var param3 = c + "," + d;
    GeneralFunction('id1', 'id2', a, b, param3);
}

然后我爆炸param3并处理php文件中的c和d,其中 GeneralFunction 传递param3 ....这很好。

但是,我的问题如下......以下代码是否始终可以接受?我以为我会通过重写 myFunction 来节省一步:

function myFunction(a, b, c, d) {
    //Lots of code then
    GeneralFunction('id1', 'id2', a, b, c + "," + d);
}

c和d在传递给 GeneralFunction 时连接在一起。虽然这按预期工作,但我使用的在线lint js检查器(http://www.javascriptlint.com/online_lint.php)没有检测到任何错误,连接(或执行任何类型的操作,算术,连接等)并传递参数 - 同时 - 一个普遍接受的协议?

我在谷歌搜索中找不到多少,只是因为它在我看来不起作用意味着它总能运作!

3 个答案:

答案 0 :(得分:2)

  

执行任何类型的操作(算术,连接等)并同时传递参数 - 一个普遍接受的协议?

是的,完全可以接受。实际上很少有普通变量传递给函数,通常参数由任意表达式组成。注意它们不会“同时”发生,但参数从左到右进行评估,然后将它们的结果值传递给函数。

答案 1 :(得分:1)

<html>
    <head>
        <title></title>
    </head>
    <script>
        function fun1(a,b,c,d)
        {
            alert(a+" "+b+" "+c+" "+d);
            var demo=c+","+d;
            fun2(a,b,demo);
        }
        function fun2(a,b,d)
        {
            alert(a+" "+b+" "+d);
        }
    </script>

    <body>

        <a href="javascript:void(0)" onclick="fun1(1,2,3,4)">Call</a>
    </body>
</html>

如果&#34;,&#34; (逗号)不能连接使用#或其他符号。

答案 2 :(得分:0)

老实说,这不是很明智。代码本身不仅看起来不卫生,而且还会丢失额外参数的类型信息。例如,考虑cd分别是boolnumber

var c = true,
    d = 3;

var combined = c + ',' + d; // "true,3"

combined.split(','); // ["true", "3"]

请注意,您现在有两个字符串("true""3"),而不是您的初始值。

还有其他问题。例如,如果cd是包含逗号的字符串,则最终会在另一方面产生意外结果:

var c = 'hello,world',
    d = 'foo,bar';

var combined = c + ',' + d; // "hello,world,foo,bar"

combined.split(','); // ["hello", "world", "foo", "bar"]

此时,无法确定哪些“部分”最初来自cd。所以现在你必须为逗号介绍一些转义...哎呀。

理想的解决方案是简单地更改严格的4参数要求。但是,如果无法做到这一点,我建议在数组中传递额外的变量:

function myFunction(a, b, c, d) {
    //Lots of code then
    GeneralFunction('id1', 'id2', a, b, [c, d]);
}

使用这种方法,您不会丢失类型信息,并且在另一侧检索值会更容易。