JavaScript Передача переменных через ссылку - PullRequest
2 голосов
/ 07 октября 2010

Есть ли в JavaScript эквивалент для передачи ссылок PHP по переменным?

[PHP]:

function addToEnd(&$theRefVar,$str)
{
    $theRefVar.=$str;
}
$myVar="Hello";
addToEnd($myVar," World!");
print $myVar;//Outputs: Hello World!

Как будет выглядеть тот же код в JavaScript, если это возможно?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 07 октября 2010

Объекты передаются как ссылки.

   function addToEnd(obj,$str)
   {
      obj.setting += $str;
   }

   var foo = {setting:"Hello"};
   addToEnd(foo , " World!");

   console.log(foo.setting);                    // Outputs: Hello World!

Редактировать:

  • Как указано в комментариях ниже, CMS упомянул замечательную статью .
  • Следует отметить, что не существует верного способа передать что-либо по ссылке в JavaScript. Первая строка была изменена с «по ссылке» на «как ссылка». Этот обходной путь настолько близок, насколько это возможно (даже глобалы иногда выглядят смешно).
  • Как указывают CMS , HoLyVieR и Matthew , следует различать, что foo является ссылкой на объект, и эта

Следующее включено в качестве еще одного способа работы со свойством объекта, чтобы сделать ваше определение функции более надежным.

   function addToEnd(obj,prop,$str)
   {
      obj[prop] += $str;
   }

   var foo = {setting:"Hello"};
   addToEnd(foo , 'setting' , " World!");

   console.log(foo.setting);                    // Outputs: Hello World!
2 голосов
/ 07 октября 2010

В Javascript нет передаваемой переменной по ссылке, как в PHP. Существует возможный обходной путь, чтобы сделать что-то подобное.

function addToEnd(obj, str)
{
    obj.value += str;
}

myVar={value:"Hello"};

addToEnd(myVar, " World");   
alert(myVar.value); //Outputs: Hello World!

В этом примере происходит то, что вы передаете объект функции, а внутри нее вы модифицируете объект (не переменную , переменная все еще указывает к тому же объекту). Вот почему эта переменная, не передаваемая по ссылке, неправильно указала vol7ron.

1 голос
/ 07 октября 2010

Другие ответы / комментарии достаточно хорошо описывают ситуацию, но я подумал, что я бы предложил и альтернативу, если вам нужен этот стиль функциональности, используя обратный вызов.* и

function addToEnd(original, str, setValue)
{
    setValue(original += str);
}

, но лучшим решением будет

var someText = "asd";
someText = addToEnd(someText, "fgh");

и

function addToEnd(original, str)
{
    return original += str;
}
0 голосов
/ 16 марта 2011

попробуйте это:

// function
function func(param,callback){
    if(param){
     if(typeof callback=='function') {
         callback.call(this,param);
     }
     return true;
    }
    return false;
}
// calling function
var variable=0;
returnValue=func(10,function(reference){variable=reference});
alert(returnValue+'/'+variable);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...