Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过字符串和eval以及多个函数和所有种类传递未知数量的变量_Javascript_Ajax_Parameters_Eval_Object Literal - Fatal编程技术网

Javascript 通过字符串和eval以及多个函数和所有种类传递未知数量的变量

Javascript 通过字符串和eval以及多个函数和所有种类传递未知数量的变量,javascript,ajax,parameters,eval,object-literal,Javascript,Ajax,Parameters,Eval,Object Literal,简而言之,我想使用对象文字来允许我以任何顺序向函数传递未知数量的变量。虽然这在理论上并不是什么大问题,但在我的代码中,这个对象文本被传递给第二个函数,该函数名为_change on_change通过将元素的innerHTML与字符串进行比较来工作;如果相同,则设置再次调用函数的超时。如果元素的innerHTML与字符串不同,则执行第三个参数,即函数或字符串。不管怎样,它都会执行。我已经对这个函数进行了大量测试,并使用了一段时间 但是,我似乎无法让对象文本通过函数调用 var params = {

简而言之,我想使用对象文字来允许我以任何顺序向函数传递未知数量的变量。虽然这在理论上并不是什么大问题,但在我的代码中,这个对象文本被传递给第二个函数,该函数名为_change

on_change通过将元素的innerHTML与字符串进行比较来工作;如果相同,则设置再次调用函数的超时。如果元素的innerHTML与字符串不同,则执行第三个参数,即函数或字符串。不管怎样,它都会执行。我已经对这个函数进行了大量测试,并使用了一段时间

但是,我似乎无法让对象文本通过函数调用

var params = { xpos:'false'};
on_change('window_3_cont_buffer','','
if(Window_manager.windows[3].window_cont_buffer.getElementsByTagName(\'content\')[0].getElementsByTagName(\'p\')[0].innerHTML == \'ERROR\'){
alert(Window_manager.windows[3].window_cont_buffer.getElementsByTagName(\'content\')[0].getElementsByTagName(\'p\')[1].innerHTML);
return false;
} else { 
Window_manager.windows[3].load_xml(\'location/view.php?location_ID=3\', \'\', ' + params + ' ); }
');
我称之为表单提交的一部分。在这一行之后,我调用一个函数,通过ajax加载一些内容,这可以很好地工作,并将触发on_change函数中的代码

我已经测试了load_xml函数,它能够调用alertparam.xpos并得到正确的响应。我甚至可以添加一个未定义的检查,这样在我调用load_xml的其余时间里,我就不会被警报淹没

load_xml函数首先设置on_change函数,然后调用该函数将内容加载到隐藏的div。一旦AJAX请求更新了该div,on_change函数现在应该调用parse_xml函数。这将从xml文件中提取信息。然而这个object literal参数的思想是它可以告诉这个parse_xml函数忽略某些事情

on_change("window_" + this.id + "_cont_buffer", "", "Window_manager.windows[" + this.id + "].parse_xml('" + param + "')");
这是load_xml的一部分,它工作得非常好,即使其中有param位。除此之外,parse_xml似乎无法使用该参数

我已经能够使它达到这样一个地步,解析xml可以alertparam并给出[object object],我认为这意味着对象文本已经被传递了,但是当我尝试调用alertparam.xpos时,我没有定义


我知道这是一个大问题,我可以通过让函数接受无数布尔参数来解决它,但这不是一个很好的解决方案。

实际上,您拥有的是:

var params = {param: "value"};
foo("bar('one', 'two', 'three');");
…其中foo对该字符串使用eval,类似于:

function foo(codestring) {
    eval(codestring);
}
…您正在寻找如何在其中嵌入参数

您可以通过将对象文本序列化为字符串来实现这一点,这样当您将其与另一个字符串组合,并对整个字符串进行求值时,它就会被求值。浏览器正在慢慢地内置JSON序列化,但现在您想使用jQuery、Prototype,或者如果您只想使用这个部分,它提供JSON.stringify来将可以转换为JSON字符串的对象转换为JSON字符串。因此:

var params = {param: "value"};
foo("bar(" + JSON.stringify(params) + ");");
但您真正想要做的是重构,以便所有逻辑都以代码的形式表示,而不是字符串中的代码。然后您可以直接传递文本,再加上大量其他好处,包括模块化、调试等

var params = {param: "value"};
function callBar() {
   bar(params);
}
foo(callBar);
…更改foo以使其调用函数而不是求值字符串。只要有可能就要避免eval,套用达赖喇嘛的话,eval(几乎)总是可能的。我的示例foo更改为:

function foo(func) {
    func();
}

如果foo需要为bar包含额外的信息,并且如果callBar被设置为处理这些额外的参数,那么它可以使用或来实现这一点。这些链接是指向MDC的,但别担心,它们不是特定于Firefox的,它们在ECMA规范中已经存在多年,几乎得到了普遍支持。

你不能将对象放入字符串中。您必须序列化对象,将其添加到字符串中,然后在另一端将其解析回结构化对象。最简单的方法是通过JSON.stringify使用JSON,或者对于没有JSON.stringify的旧浏览器使用库回退,因为JSON的计算结果是简单的JavaScript

请注意,您不会得到完全相同的对象,而是具有相同属性和属性的新对象,并且它只适用于简单类型,因此您不能在对象中包含函数或任何内容

然而,在任何情况下,以字符串形式传递JavaScript代码都是一种必须极力避免的反模式。取而代之的是使用内联函数,您不必担心什么可以和什么不能放在字符串中,您可以摆脱所有无法阅读的包装和转义:

var params = {xpos: 'false'};
on_change('window_3_cont_buffer', '', function() {
    var w= Window_manager.windows[3];
    var ps= w.window_cont_buffer.getElementsByTagName('content')[0].getElementsByTagName('p');
    if (ps[0].innerHTML==='ERROR') {
        alert(ps[1].innerHTML);
        return false;
    } else { 
        w.load_xml('location/view.php?location_ID=3', '', params);
    }
});

一些可能对您有帮助的一般技巧:

// Example of calling function objects given as arguments:

function on_change(foo, callback1, callback2) {
    if (foo)
        callback1();
    else
        callback2.call(available_as_this);
}

on_change(foo, function() { your code }, function() { another code });


// Example of function taking arbitrary number of arguments:

function any_params() {
    console.log('I got ' + arguments.length + 'arguments!');
    console.log('First argument: ' + arguments[0]);
}

any_params('one', 'two', 'three', [], null, {});
请参阅变量和

我想使用objectliteral来允许我以任意顺序向函数传递随机数量的变量


为什么不创建一个包含参数和函数的对象,并传递它呢?在尝试使用接收函数之前,它可以测试对象的属性是否已设置。

无可否认,内嵌函数是我从未想过的。。。尽管我努力确保on_change可以处理一个函数。这就是 这意味着,当我通过参数,我甚至可以直接把它放在地方,应该拿起它,因为它是。谢谢