Javascript: передача функции по ссылке, а не по значению

#javascript #function #pointers

#javascript #функция #указатели

Вопрос:

Если у меня есть

 var foo = function() {
    console.log('foo');
}, bar = foo;
  

и вызов bar() , консоль регистрируется foo . Если тогда, я делаю

 foo = function() {
    console.log('not foo');
}
  

и при вызове bar() консоль все еще регистрируется foo . Как я могу обойти это?

Комментарии:

1. Чего именно вы на самом деле пытаетесь достичь здесь? Зачем вам это на самом деле нужно?

2. @MattBurland Ничего. Просто интересно, возможно ли это.

3. Я думаю, вам следует прочитать это developer.mozilla.org/en-US/docs/Talk:JavaScript/Guide /…

4. Я думаю, вы могли бы сделать это: bar = function() { foo(); } , что не совсем то, что вы хотели, но если вы сейчас переопределите foo , вызов bar вызовет новую foo функцию.

Ответ №1:

то, что вы пытаетесь сделать, не очень разумно, но я вручу вам дробовик, стреляйте! (я имею в виду ваши ноги.)

 var foo = function () { console.log("foo"); }
var bar = function () { foo(); }
bar();
var foo = function () { console.log("qux"); }
bar();
  

Комментарии:

1. Не уверен, что я понял, не будет ли последний вызов bar() все еще регистрироваться qux , поэтому foo изменился точно так же, как в вопросе?

2. Это действительно было бы, в отличие от первого вызова, который будет регистрироваться foo .

Ответ №2:

Я бы создал объект и создал функцию, в которую я хочу скопировать свойство этого объекта:

 var obj = {
    bar : function(){ alert 'bar'; }
},
obj2 = obj;
obj.bar = function(){ alert 'foo'; };
  

затем

 obj2.bar()
  

выводил бы ‘foo’;

Комментарии:

1. Ах, я никогда не знал, что объекты передаются по ссылке. Но подождите, это работает по-другому? obj2.bar Меняется obj.bar ли изменение?

2. Да, если вы сомневаетесь во мне, вы можете запустить его самостоятельно.obj2.bar и obj.bar — это то же свойство объекта, на которое ссылаются obj2 и obj.

3. Я не сомневался в вас, я просил разъяснений относительно функции, о существовании которой я никогда не знал.

4. Объекты @Bluefire на самом деле не передаются по ссылке. Все в JavaScript, что имеет объект в качестве значения (переменная, параметр или свойство объекта, или вообще любое выражение), действительно имеет ссылку на объект в качестве его значения. Это все, что вы можете иметь; в отличие от C , нет такой вещи, как переменная, значение которой действительно является объектом. Таким образом, JavaScript всегда передается по значению, но значения объектов на самом деле являются ссылочными значениями объекта.