2009-12-03 5 views
6

Взгляните на следующий код:Передача параметра в качестве указателя в JavaScript

var o; 

(function (p) { 
    p = function() { 
     alert('test'); 
    }; 
})(o); 

o(); // Error: 'o is not a function' 

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

Мой вопрос в том, как передать этот аргумент «по ссылке», чтобы изменить указатель, на который он указывает?

ответ

12

Вы можете достичь желаемого эффекта, воспользовавшись тем, что Javascript передает объекты по ссылке:

var o = { }; 

(function (p) { 
    p.fn = function() { 
     alert('test'); 
    }; 
})(o); 

o.fn(); 
+6

Фактически, «передавать по ссылке» является немного неправильным в JavaScript. По отношению к другим языкам, которые имеют настоящие «ссылочные» типы, JavaScript делает * не * передавая что-либо по ссылке. Он всегда проходит по значению. Это значение может * держать * ссылку, которая, как я думаю, вы пытаетесь сказать. –

1

Когда вы передаете в переменной о в вашем примере, вы передаете неопределенное значение, не ссылка на что угодно. Что вам нужно сделать, это отправить родительские объекты. В этом случае объект окна (при условии, что вы используете браузер).

(function (p, name) { 
    p[name] = function() { 
     alert('test'); 
    }; 
})(window, "o"); 
o(); 

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

function o() { 
    alert('test'); 
}; 
o(); 
3

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

var o = (function(p) { 
    return function() { 
     alert('test'); 
    }; 
})(); 

o(); 
+0

Причина, по которой я буду использовать вышеупомянутую идиому, заключается в том, что если я хочу изменить имя основного объекта ('o'), мне нужно изменить его только с первой строки (' var o; ') и из той части, где я передаю ее как параметр (')) (o);'); Мне не нужно ничего менять из анонимной функции. –

Смежные вопросы