2015-10-17 7 views
1

Я знаю, что я делаю что-то несправедливое в использовании пространств имен. Я отправляю этот вопрос после исследования тонны в поиске/google. Все еще не могу найти то, что я делаю неправильно. Не могли бы вы помочь мне? Это то, что у меня естьПространство имен Javascript - обмен переменной между функциями

Javascript

Javascript file1

(function (js_namspace1, $, undefined) { 
    js_namespace1.n1function1 = function(){ 

     var return_obj = { 
     return_function_to_call: “n1function_name2” 
     return_function_to_call_namespace: “js_namespace1” 
     } 
     js_namespace2.n2function1(return_obj) 
    } 
    Js_namespace1.n1function_name2 =function(list_of_names){ 
     Js_namespace1.list_of_names = list_of_names 
     // do some processing to js_namespace1. list_of_names 
    } 
} 
(window. js_namspace1 = window. js_namspace1|| {}, jQuery)); 

Javascript file2

(function (js_namspace2, $, undefined) { 
    js_namespace2.n2function1(return_obj) = function(return_obj){ 
    js_namespace2.return_function_to_call =  return_obj.return_function_to_call 
    js_namespace2.return_function_to_call_namespace = return_obj. .return_function_to_call_namespace 

    // do some processing 
    Js_namespace2.list_of_names = [] 
    Js_namespace2. list_of_names.push(value_name) 
    window[js_namespace2.return_function_to_call_namespace][js_namespace2.return_function_to_call](Js_namespace2.list_of_names); 
    } 
} 
(window. js_namspace2 = window. js_namspace2|| {}, jQuery)); 

Html

От HTML file1 вызова js_namespace1.n1function1 на основе конечного пользователя, нажав поле,

// js_namespace1.n1function1 вызовы js_namespace2.n2function1 и отображает другой HTML file2

// В HTML file2 процесс данные (собирать значения имен), а затем вызвать функция возврата Js_namespace1.n1function_name2

в Js_namespace1.n1function_name2, процесс Js_namespace1.list_of_names(array), но когда я делаю это, и изменения в Js_namespace2.list_of_names

Например, когда я Js_namespace1.n1function_name2.push(add_another_name), а затем позвоните js_namespace1.n1function1 (который, в свою очередь, вызывает js_namespace2.n2function1). Js_namespace2.list_of_names содержит значение add_another_name.

Обратите внимание: когда js_namespace2.n2function1 вызывается из js_namespace1.n1function1, массив не передается как параметр.

Мои ожидания был когда js_namespace1.n1function1 звонки js_namespace2.n2function1 это бы не обновитьJs_namespace2.list_of_names с add_another_name.

Не могли бы вы объяснить, что происходит? самое главное указать на любые ошибки, которых я должен избегать в этом проекте (пространство имен, обмен параметрами между вызовами функций). Я правильно использую пространство имен в javascript - рекомендую ли какие-либо рекомендации?

+0

Вы можете предоставить jsfiddle? – Grundy

+3

Первое, что нужно сделать, это проверить консоль разработчика. У вас много опечаток в вашем коде ('Var' вместо' var' и т. Д.). – Pointy

+0

Пожалуйста, напишите свой код в редакторе, а не в текстовом редакторе. Вопросы правописания и обсадной колонны в программировании. Используйте '' ... "' not '" ... "', используйте 'js_namespace ...' not 'Js_namespace ...'. Кроме того, некоторые отступы могли бы облегчить читаемость. – Bergi

ответ

0

Вот link из быстрого поиска Google о лучших практиках для JS. Существуют различные школы мысли (например, use of terminating semicolons), но использование какого-то линта может помочь вам разобраться с опечатками, чувствительностью к регистру и непреднамеренными пробелами в коде, если вы не заметите сами. Ниже код с некоторыми исправлениями:

(function (js_namespace1, $, undefined) { 

    js_namespace1.n1function1 = function(){ 

     var return_obj = { 
     return_function_to_call: "n1function_name2", 
     return_function_to_call_namespace: "js_namespace1" 
     }; 
     js_namespace2.n2function1(return_obj) 
    }; 
    js_namespace1.n1function_name2 =function(list_of_names){ 
     js_namespace1.list_of_names = list_of_names; 
     console.log(js_namespace1.list_of_names); // ["some_name"] 
    }; 
} 
(js_namespace1 = window.js_namespace1 || {}, jQuery)); 

(function (js_namespace2, $, undefined) { 
    js_namespace2.n2function1 = function(return_obj){ 
    js_namespace2.return_function_to_call = return_obj.return_function_to_call; 
    js_namespace2.return_function_to_call_namespace = return_obj.return_function_to_call_namespace; 

    // do some processing 
    js_namespace2.list_of_names = []; 
    js_namespace2.list_of_names.push("some_name"); 
    window[js_namespace2.return_function_to_call_namespace][js_namespace2.return_function_to_call](js_namespace2.list_of_names); 
    }; 
} 
(js_namespace2 = window.js_namespace2 || {}, jQuery)); 
js_namespace1.n1function1(); 

Некоторые пункты о вашем коде, и мои исправления:

  • Вы использовали, чувствительных к регистру имен, как js_namespace2 для Js_namespace2.
  • Ваш синтаксис здесь неверно js_namespace2.n2function1(return_obj) = function(return_obj).
  • И здесь: return_obj. .return_function_to_call_namespace и другие.
  • value_name не определен

Я тестировал код here и увидеть ожидаемое поведение.

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