Подтвердить что ты не робот

Ссылка/псевдоним переменной javascript

Возможно ли в javascript назначить псевдоним/ссылку на локальный var someay?

Я имею в виду что-то вроде C:

function foo() {
  var x = 1;
  var y = &x;
  y++;
  alert(x); // prints 2 
}

= EDIT =

Возможно ли использовать псевдоним arguments.callee в этом коде?:

function foo() {
  arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0;
  arguments.callee.myStaticVar++;
  return arguments.callee.myStaticVar;
}
4b9b3361

Ответ 1

В JavaScript примитивные типы, такие как целые числа и строки, передаются по значению, тогда как объекты передаются по ссылке. Поэтому для этого вам нужно использовать объект:

// declare an object with property x
var obj = { x: 1 };
var aliasToObj = obj;
aliasToObj.x ++;
alert( obj.x ); // displays 2

Ответ 2

В какой-то мере это возможно, вы можете создать псевдоним для переменной с помощью закрытий:

Function.prototype.toString = function() {
    return this();
}

var x = 1;
var y = function() { return x }
x++;
alert(y); // prints 2, no need for () because of toString redefinition 

Ответ 3

Если вы можете псевдоним, то что-то зависит от типа данных. Объекты, массивы и функции будут обрабатываться с помощью ссылки, а псевдонирование возможно. Другие типы по существу атомарны, и переменная хранит значение, а не ссылку на значение.

arguments.callee - это функция, поэтому вы можете ссылаться на нее и изменять этот общий объект.

function foo() {
  var self = arguments.callee;
  self.myStaticVar = self.myStaticVar || 0;
  self.myStaticVar++;
  return self.myStaticVar;
}

Обратите внимание, что если в приведенном выше коде вы должны были сказать self = function() {return 42;};, тогда self будет ссылаться на другой объект, чем arguments.callee, который остается ссылкой на foo. Когда у вас есть составной объект, оператор присваивания заменяет ссылку, он не изменяет упомянутый объект. С атомными значениями такой случай, как y++, эквивалентен y = y + 1, который присваивает переменной значение "новое".

Ответ 4

изменить мой предыдущий ответ: если вы хотите подсчитать вызовы функций, вы можете попробовать:

var countMe = ( function() {
  var c = 0;

  return function() {
    c++;
    return c;
  }
})();

alert(countMe()); // Alerts "1"
alert(countMe()); // Alerts "2"

Здесь c служит счетчиком, и вам не нужно использовать arguments.callee.

Ответ 5

Развернув user187291 post, вы также можете использовать геттеры/сеттеры, чтобы обойтись, чтобы использовать функции.

var x = 1;
var ref = {
    get x()  { return x; },
    set x(v) { x = v; }
};
(ref.x)++;
console.log(x); // prints '2'
x--;
console.log(ref.x); // prints '1'

Ответ 7

в 2019 году мне нужно написать минимизированные плагины jquery, поэтому мне нужен и этот псевдоним, и поэтому, тестируя эти и другие примеры из других источников, я нашел способ без копирования в память всего объекта, но создание только ссылки. Я проверял это уже с Firefox и наблюдал за памятью вкладки диспетчера задач на Firefox раньше. Код является:

var {p: d} ={p: document};
console.log(d.body);