Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.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中通过引用传递变量?从返回多个值的ActiveX函数读取数据_Javascript_Activex - Fatal编程技术网

如何在javascript中通过引用传递变量?从返回多个值的ActiveX函数读取数据

如何在javascript中通过引用传递变量?从返回多个值的ActiveX函数读取数据,javascript,activex,Javascript,Activex,我有一个ActiveX对象,我想在浏览器中使用它(javascript)。 我想调用一个函数。其原型是: function TOPOSFiscalPrinter.DirectIO(Command: Integer; var pData: Integer; var pString: WideString): Integer; 因此,函数返回三个值:结果代码、pData和pString 在javascript中,函数不更新变量pData和pString function test() {

我有一个ActiveX对象,我想在浏览器中使用它(javascript)。
我想调用一个函数。其原型是:

function TOPOSFiscalPrinter.DirectIO(Command: Integer; var pData: Integer;
  var pString: WideString): Integer;
因此,函数返回三个值:结果代码、pData和pString
在javascript中,函数不更新变量pData和pString

function test()
{
  var d=1, s="DIRECIO:";
  var code = opos.DirectIO(1024, d, s);

  alert(d); alert(s);
}
变量
d
s
不会更新。它们必须是d=0和s=“ED123456”
如何从javascript中返回多个值的函数中读取数据

编辑
显然,Javascript总是通过值传递参数,而不是通过引用传递参数。
我可以在Javascript中通过引用传递值吗 我将不得不改变我的设计,只依赖于通过的参数
值和返回值。

原语类型,主要是字符串/数字/布尔值,通过值传递以提高效率。函数、对象、数组等对象通过引用传递。您可以创建一个对象并传递它,例如{d:1,s:'directo'},然后更改值,因为您传递的是引用。

JavaScript中不支持输出参数。打包要在自动化对象中返回的内容,为其属性赋值并返回,或者如果返回值已被占用,则创建一个类,该类具有可在ActiveX中指定的属性,并添加一个类型为该类的参数。在ActiveX中,您可以使用IDispatch/Ex获取/设置属性。

创建全局变量或对象。或者,如果您担心其他函数访问和更改变量,请创建一个单例。另一个选项是返回一个对象。像这样

function TOPOSFiscalPrinter.DirectIO(Command: Integer; var pData: Integer;
  var pString: WideString): Integer;

function TOPOSFiscalPrinter.DirectIO(Command, pData, pString){
    ....

    var pObj = {
        d: 0,
        s: '',
        code: ''
    }
    pObj.d = pDataAltertedValue;
    pObj.s = pStringAltertedValue;
    pObj.code = code;
    return pObj;
}

function test() 
{
    var d=1, s="DIRECIO:";
    var r = opos.DirectIO(1024, d, s);
    code = r.code;
    d = r.d;
    s = r.s;



    alert(d); alert(s);
}

出于性能原因,诸如
int
float
之类的基本体总是按值传递,但您可以将它们包装成一个仅包含一个元素的
Float32Array

a = new Float32Array([123])
a[0]; // == 123
function ChangeA(a) {
    a[0] = 333;
}
ChangeA(a)
a[0]; // == 333

它也不起作用。d=新对象(1);s=新对象('DIRECTIO:');顺便说一下,我的意思不是为每个变量创建一个新对象,我的意思是创建一个对象文本,比如
var obj={d:'string',l:'otherthing'}
并通过
obj
…函数测试(){var d=new Object(1);var s=new Object('DIRECTIO:');opos.DIRECTIO(1024,d,s);//这是我的activex函数警报(d);警报(s);}呼叫后d=1;s='DIRECTIO:';没有变化。d应为d=0;s应为s='ED123456';我还尝试了var d=newobject();d、 数值=1;var s=新的Objevt();s='方向:';但是没有运气。