2016-02-16 3 views
0

Итак, началось перенос одной из моих программ на C# на Javascript, только потому, что это было хорошим способом познакомиться с ней. Но у меня проблемы с моими массивами; они находятся внутри объектов, и они продолжают странно меняться, когда им этого не нужно.Значение массива изменяется необъяснимо?

Я проверка _in и _out значений дважды от первого объекта, RotorSetI; сначала после создания объекта и снова после объекта RotorSetII.

Первая проверка, показывает _out имеет значение, которое было присвоено. Но при второй проверке он изменился на значение _out значения RotorSetII.

Я выложу код ниже, но я полностью озадачен. Что я делаю неправильно?

var RotorSetI = (function() 
{ 
    var app = {}, 

    _in = new Array("P","4","K","Ö","7","M","T","U","G","Q","V","1","J","H","2","Ä","S","I","Y","D","R","X","E","N","W","8","C","B","L","3","5","0","6","Z","F","9","O","A"); 
    _out = new Array("J","K","X","9","U","C","T","G","4","H","F","B","I","8","D","R","3","7","L","V","Ö","Y","N","1","W","0","S","A","6","Ä","Q","O","Z","P","E","2","5","M"); 

    app.setIn = function() 
    { 
     return _in; 
    } 

    app.setOut = function() 
    { 
     return _out; 
    } 

    return app; 
}()); 

console.log(RotorSetI.setIn()); 
console.log(RotorSetI.setOut()); /* <-- Still shows the right value */ 

/** 
* ROTOR SET II 
*/ 
var RotorSetII = (function() 
{ 
    var app = {}, 

    _in = new Array("E","7","2","Ö","S","N","U","O","J","B","I","L","D","M","H","F","6","Q","P","0","Z","C","T","V","3","W","4","5","1","Y","X","9","Ä","K","8","R","A","G"); 
    _out = new Array("Ä","6","V","S","H","B","K","F","N","P","M","X","C","W","I","5","Ö","0","4","3","Q","Y","J","Z","D","L","T","9","O","E","U","R","8","2","G","1","A","7"); 

    app.setIn = function() 
    { 
     return _in; 
    } 

    app.setOut = function() 
    { 
     return _out; 
    } 

    return app; 
}()); 


console.log(RotorSetI.setIn()); 
console.log(RotorSetI.setOut()); /* <-- Value has mysterious changed! */ 

А вот выход:

["P", "4", "K", "Ö", "7", "M", "T", "U", "G", "Q", "V", "1", "J", "H", "2", "Ä", "S", "I", "Y", "D", "R", "X", "E", "N", "W", "8", "C", "B", "L", "3", "5", "0", "6", "Z", "F", "9", "O", "A"] 
["J", "K", "X", "9", "U", "C", "T", "G", "4", "H", "F", "B", "I", "8", "D", "R", "3", "7", "L", "V", "Ö", "Y", "N", "1", "W", "0", "S", "A", "6", "Ä", "Q", "O", "Z", "P", "E", "2", "5", "M"] 
["P", "4", "K", "Ö", "7", "M", "T", "U", "G", "Q", "V", "1", "J", "H", "2", "Ä", "S", "I", "Y", "D", "R", "X", "E", "N", "W", "8", "C", "B", "L", "3", "5", "0", "6", "Z", "F", "9", "O", "A"] 
["Ä", "6", "V", "S", "H", "B", "K", "F", "N", "P", "M", "X", "C", "W", "I", "5", "Ö", "0", "4", "3", "Q", "Y", "J", "Z", "D", "L", "T", "9", "O", "E", "U", "R", "8", "2", "G", "1", "A", "7"] 
+0

Это потому, что вы повторно используете глобальную переменную '_out'. –

+0

Вы забыли 'var _in, _out;' –

+0

Это не произошло бы с одной переменной var. –

ответ

4

Вы должны , в конце вашего _in декларации. Вы случайно создаете глобальное название _out и перезаписываете его в RotorSetII.

var app = {}, 
    _in = new Array(...), // <-- 
    _out = new Array(...); 

В общем про-наконечнике, это считается хорошей практикой в ​​JavaScript, чтобы объявить массив с использованием массива литералов вместо того Array конструктора.

_in = ["P", ...] 
+0

Ahhhh .... да, я вижу. В статье, которая показала мне, что этот способ делать объекты, имел только одну частную собственность в своем примере, поэтому я не знал о запятой :) – Cory

+1

Большое спасибо. – Cory

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