This question already has answers here:
Is JavaScript a pass-by-reference or pass-by-value language?
                                
                                    (30个答案)
                                
                        
                4年前关闭。
            
        

我知道我在使用命名空间时犯了严重错误。我在网络/谷歌搜索中研究了一吨后发布了这个问题。仍然找不到我在做什么错。你能帮我吗?
这就是我所拥有的

Java脚本

Javascript文件1

(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文件2

(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中正确使用了名称空间-有什么推荐的最佳做法?

最佳答案

这是来自Google的link快速搜索,介绍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,并查看了预期的行为。

09-25 20:10