#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 всегда передается по значению, но значения объектов на самом деле являются ссылочными значениями объекта.