2012-02-27 2 views
4

Могу ли я получить доступ к аргументам функции вне функции?Как я могу получить доступ к аргументу функции JavaScript вне функции?

Вот мой код:

function viewmessage(username,name) { 
     //alert(name + " : " + username); 
     $('#heading').html(name); 
     $.get('/notification/viewmessage', {user:username}, function(data) { 
      $('#messagesfrom').html(data); 
      $('#newmessage').slideDown(200); 
     }); 
    } 
alert(name + " : " + username); 
+5

Там нет * хорошего * способа сделать это, потому что он не должен» Это будет сделано. – alex

+0

Не знаете, в чем ваш вопрос. Javascript похож на большинство языков, вы не можете получить доступ к переменным за пределами их возможностей. Что вы пытаетесь сделать (больше кода может помочь). – Paddy

+1

это невозможно нет. В то же время, эти параметры должны исходить откуда-то вправо? Как вы называете эту функцию? Почему вы хотите оповещать о выходе вне функции? –

ответ

5

Вы не можете, если вы не объявить переменную вне функции.

Вы можете использовать одни и те же имена переменных в глобальной области видимости:

function viewmessage(username, name){ 
    window.username = username; 
    window.name = name; 
} 
alert(window.name + " : " + window.username); // "undefined : undefined" 
alert(name+" : "+username); // ReferenceError: 'name' not defined 

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

var username2, name2; 
function viewmessage(username, name){ 
    username2 = username; // No "var"!! 
    name2 = name; 
} 
alert(username2 + " : " + name2); // "undefined : undefined" 
viewmessage('test', 'test2'); 
alert(username2 + " : " + name2); // "test : test2" 
+0

Хотя это правильно, я бы не рекомендовал это делать ... – NDM

+2

@NickyDeMaeyer Вы имеете в виду использование глобальных переменных. Это не рекомендуется, поскольку потенциальные конфликты переменных с другими встроенными скриптами. Кроме того, глобальная область не должна излишне загрязняться ненужными глобальными переменными. –

0

Вы не получаете доступ к параметрам функции вне функции. Вот что такое переменная область охвата.

Если вы хотите получить доступ к значению переменной, вам необходимо передать это значение глобальной переменной изнутри вашей функции, а затем вы сможете получить доступ к этому значению извне.

Не путайте переменную со значением.

0

Это относится к области определения аргументов и их определению. Вам нужно включить оповещение в функцию, которая получает аргументы. Либо это функция, которая вызывает viewMessage, а затем предупреждение, или если вы хотите предупреждение после запроса AJAX переместить уведомление в обработчик успеха, как показано на рисунке:

function viewmessage(username,name){ 
     $('#heading').html(name); 
     $.get('/notification/viewmessage',{user:username},function(data){ 
      $('#messagesfrom').html(data); 
      $('#newmessage').slideDown(200); 
      alert(name+" : "+username); 
     }); 
    } 
1

Вы можете вернуть эти переменные в функции:

var viewmessage = function(username, name){ 
    // Blabla 
    return { 
     username: username, 
     name: name 
    } 
} 

// And then... 
var vm = viewmessage('wutup', 'Peter'); 
alert(vm.name +" : "+ vm.username); 
1

Внутри функции я указал имя пользователя как идентификатор кнопки отправки. или может использовать пустой div тоже.

function viewmessage(username,name){ 
     //alert(name+" : "+username); 
     $("#submit").attr('id', username); 
     $('#heading').html(name); 
     touser = username; 
     $.get('/notification/viewmessage',{user:username},function(data){ 
      $('#messagesfrom').html(data); 
      $('#newmessage').slideDown(200); 
     }); 
    } 
var touser = $("#submit").attr("id"); 
alert(touser); 

спасибо, кто ответил на мой вопрос.

1

Вы можете использовать регулярные выражения (регулярные выражения), чтобы получить аргументы:

function viewmessage(username, name) {/*...*/} 
var args = viewmessage.toSource() 
      .match(/\((?:.+(?=\s*\))|)/)[0] 
      .slice(1).split(/\s*,\s*/g); 
//args = ["username", "name"] 

Убедитесь, хотя, у вас нет никаких пробелов после ( или перед ). В противном случае, вы можете иметь этот результат:

function viewmessage(username, name) {/*...*/} 
var args = viewmessage.toSource() 
      .match(/\((?:.+(?=\s*\))|)/)[0] 
      .slice(1).split(/\s*,\s*/g); 
//args = [" username", "name "] 

Или вы используете trim() по каждому из аргументов после того, как вы собрали их:

args.forEach(function (e, i, a) {a[i] = e.trim();}); 
//args = ["username", "name"] 
Смежные вопросы