Сохранение функции ссылки - PullRequest
0 голосов
/ 04 января 2012

Дилемма новичка JS:

var a = function() {console.log(5);}

var b = a;

a = function() {console.log(6);}

очевидно b == function() {console.log(5);}

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

Ответы [ 5 ]

2 голосов
/ 04 января 2012

Это невозможно.
Javascript не поддерживает ссылки на переменные.

Вы можете написать var b = function() { return a.apply(this, arguments); }, но b все равно будет другим объектом.

0 голосов
/ 04 января 2012

Javascript не дает вам прямого контроля над указателями, но вы можете обойти это, никогда не назначая a или b. Вместо этого установите их обоих так, чтобы они указывали на один и тот же объект, а затем измените свойство объекта следующим образом.

var a = {fn:function() {console.log(5);}};
var b = a;
a.fn = function() {console.log(6);};
b.fn(); // logs 6
0 голосов
/ 04 января 2012

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

var a = { func: function() { console.log(5); } };
var b = a;
b.func(); // will print 5 to the console

a.func = function() { console.log(6); };
b.func(); // will print 6 to the console
0 голосов
/ 04 января 2012

Эта строка:

var a = function() {console.log(5);}

... создает объект в памяти - функцию - и сохраняет ссылку на него в a.

Аналогично, эта строка:

b = a;

... сохраняет в b ссылку на a.

Итак, вы должны быть в состоянии предсказать, что делает эта строка:

a = function() {console.log(6);}

Хранит ссылку на какую-то новую функцию в a. Это никак не влияет на b. Другими словами, b - это , а не и псевдоним для a. Случайно, что он когда-то указывал на ту же область памяти, что и a. Это отдельные независимые переменные, способные указывать на любой произвольный объект в памяти. Конечно, они могут указывать на один и тот же объект, но это так же важно, как и когда-либо.

0 голосов
/ 04 января 2012

немного насмешливо, но это должно достичь того, что вы пытаетесь сделать, если я вас правильно понял:

var b = function() { a(); }
...