将对象作为参数传递给函数

Posted

技术标签:

【中文标题】将对象作为参数传递给函数【英文标题】:Passing Object to function as a parameter 【发布时间】:2019-07-07 04:42:19 【问题描述】:

我正在尝试将对象(JSON 数组)发送到函数中的 xmlHttprequest。如果我在getToteMatrix 函数中硬编码body 变量,它就可以工作。但是,当我尝试从函数外部将 body 变量传递给函数时,我收到 500 错误。

在函数内部声明主体变量:) 调用函数并将主体变量传递给函数。 :( 将body变量直接传递给函数:(
getToteMatrix(body);

var body = '"Action":"<must be non blank>", "SubAction":"", "Cart":"", "CartPositions":1,"OverallTC":false, "ErrorMessage":"","UserResponse1":"","UserResponse2":"","UserResponse3":"","DisplayData":["Part":"", "PartDesc1":"", "PartDesc2":"", "UserField":"", "Location":"", "DirectionalDisplay":"", "TotalPickQty":"5", "StartingAisle":"","FullTote":"", "FullToteQty":"", "NewToteQty":""    ],"BatchData":["RemainingPickLines":0, "RemainingLocs":0, "CurrentPicksPerHourRate":0.000],"AlphaPos":["Pos": 1, "PrimaryModule":1, "SecondaryModule":3, "Message":"1111", "Color": 1, "BlinkSpeed": 0, "Buzzer": true, "Enable":true,"Pos": 2, "PrimaryModule":2, "SecondaryModule":4, "Message":"2222", "Color": 1, "BlinkSpeed": 0, "Buzzer": false, "Enable":true],"BatchPos": ["Pos": 15, "PrimaryModule":1, "SecondaryModule":51, "Display":"*15*", "TC":false, "Color":1, "BlinkSpeed":0, "Enable":true, "Visible":true, "Pos": 2, "PrimaryModule":2, "SecondaryModule":52, "Display":"2222", "TC":false, "Color":1, "BlinkSpeed":0, "Enable":true, "Visible":true, "Pos": 5, "PrimaryModule":5, "SecondaryModule":55, "Display":"FIVE", "TC":false, "Color":1, "BlinkSpeed":0, "Enable":true, "Visible":true,"Pos": 3, "PrimaryModule":3, "SecondaryModule":53, "Display":"3333", "TC":false, "Color":1, "BlinkSpeed":0, "Enable":true, "Visible":false,"Pos": 4, "PrimaryModule":4, "SecondaryModule":54, "Display":"4444", "TC":false, "Color":1, "BlinkSpeed":0, "Enable":true, "Visible":true]';

function getToteMatrix(body) 
    // when the body variable is declared here the xml request works just fine.           
    // var body = (above json)

    var xmlhttp = new XMLHttpRequest();
    var url = "http://promat.dovetree.com/cart/cart/batchpos";

    xmlhttp.onreadystatechange = function () 
        if (this.readyState === 4 && this.status === 200) 
            document.getElementById("id01").innerhtml = this.responseText;
        
    ;
    xmlhttp.open("POST", url, true);
    xmlhttp.send(body);

该函数应获取数据并以从服务器推送的 HTML 格式输出。我在函数外部声明的变量出现 500 错误。

【问题讨论】:

你没有显示你如何调用getToteMatrix - 也许你是,但你搞砸了代码格式......在声明var body之前调用getToteMatrix(body);将意味着你调用@ 987654328@ undefined 作为参数 如前所述,您需要显示更多代码,以便我们更好地了解您在做什么,但根据我的解释方式,听起来您可能需要调用JSON.stringify 在将对象传递给 getToteMatrix 之前将其转换为 JSON。 getToteMatrix(JSON.stringify(my_object)) @clockwatcher body 已经是 JSON 格式的字符串了。 @Barmer - 他的问题指出“如果我对它工作的主体进行硬编码”,这意味着它作为一个字符串工作。但是我们没有他实际调用它的代码来查看他真正传递的内容。我猜这正是问题所在——当他实际调用他的函数时,他传递的不是字符串而是对象。这就是为什么我提到我们需要查看更多代码。 首先你需要写一个函数然后你调用这个函数。 【参考方案1】:

我认为您会收到 500 错误,因为当您使用 body 作为参数调用 getToteMatrix() 时,body未定义

由于 hoistingjavascript 编译器会像这样读取变量:

getToteMatrix // function reference
anotherBody
body

函数声明在变量声明之前。

检查以下示例:

第一次调用getToteMatrix(body)body 未定义。 第二次调用getToteMatrix(anotherBody),我们在调用之前声明了anotherBody,所以它会打印在控制台中。

getToteMatrix(body);

var anotherBody = 'anotherBody';
getToteMatrix(anotherBody);

var body = 'text';
function getToteMatrix(body) 
    console.log(body);

【讨论】:

谢谢!这绝对是我的问题之一。第二个问题是 Body 是 JSON 对象的解析形式。我应该将 (evt.data) 原始 JSON 传递给函数。再次感谢!【参考方案2】:
function getToteMatrix(body) 
    console.log(body);

// first call
var body = 'text';
getToteMatrix(body);

// second call
var anotherBody = 'anotherBody';
getToteMatrix(anotherBody);

这里你需要这样调用你需要先写一个函数然后调用一个函数否则你将无法得到正确的答案。

【讨论】:

以上是关于将对象作为参数传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?

将对象作为参数传递给构造函数并将其属性复制到新对象?

将 ListBox 控件对象传递给需要 ListBox 作为参数的函数

对象作为参数传递给另一个类,通过值还是引用?

如何将带有 args 的成员函数作为参数传递给另一个成员函数?

C++ 将列表作为参数传递给函数