Как передать переменную по ссылке в JavaScript? Чтение данных из функции ActiveX, которая возвращает более одного значения - PullRequest
4 голосов
/ 14 ноября 2009

У меня есть объект 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?

EDIT
Очевидно, Javascript всегда передает параметры по значению, а не по ссылке.
Есть ли что-нибудь, что я могу сделать, чтобы передать значения по ссылке в Javascript, или Мне придется изменить свой дизайн, чтобы полагаться только на параметры, переданные значение и возвращаемые значения.

Ответы [ 4 ]

4 голосов
/ 14 ноября 2009

Примитивные типы, в первую очередь строки / числа / логические значения, передаются по значению в целях эффективности. Такие объекты, как функции, объекты, массивы и тому подобное, передаются по ссылке. Вы можете создать объект и передать его, например, {d: 1, s: 'directo'}, а затем изменить значения, потому что вы передаете ссылку.

2 голосов
/ 14 ноября 2009

Нет поддержки выходного параметра в JavaScript. Упакуйте то, что вы хотите вернуть в объект автоматизации, присвойте значения его свойствам и верните его, или, если возвращаемое значение уже занято, создайте класс, свойства которого вы можете назначить в вашем ActiveX, и добавьте параметр, тип которого является учебный класс. В вашем ActiveX вы можете использовать IDispatch / Ex для получения / установки свойств.

1 голос
/ 09 мая 2017

Примитивы типа int или float всегда передаются по значению из соображений производительности, но вы можете просто обернуть их, например, в. Float32Array только с одним элементом:

a = new Float32Array([123])
a[0]; // == 123
function ChangeA(a) {
    a[0] = 333;
}
ChangeA(a)
a[0]; // == 333
1 голос
/ 17 ноября 2009

Создать глобальную переменную или объект. Или, если вы беспокоитесь о других функциях, осуществляющих доступ и изменение переменных, создайте синглтон. Другой вариант - вернуть объект. Такие как это

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...