Объекты JavaScript как параметры функции - PullRequest
1 голос
/ 08 февраля 2011

Используя JavaScript, скажем, у меня есть функция X, и в этой функции создается объект с именем objectX. функция X возвращает objectX. Позже в коде функция Z (somevar, anObject) получает objectX в качестве одного из своих параметров.

Теперь в функции Z объект X и все его свойства называются anObject внутри функции Z?

А что будет, если функция Z вернет anObject? Будет ли остальная часть кода воспринимать объект как «objectX» или «anObject»?

function X() {
    ...
    objectX = {};
    ...
    return objectX;
}

X();

function Z(anything, anObject) {
    ...
    return anObject
}

Z(something, objectX);

Ответы [ 5 ]

4 голосов
/ 08 февраля 2011

Это в основном вопрос объема.

function X() {
    // local objectX, only accessible through this name inside X()
    var objectX = {};
    objectX.foo = 'bar';
    return objectX;
}

function Z(somevar, anObject) {
    // anObject is passed in as a parameter
    // it's only accessible through this name inside Z()
    anObject.foo = somevar;
    return anObject;
}

// get the 'objectX' from X() and store it in global variable a
var a = X();

// pass the received 'objectX' into Z()
// note that the variable names objectX and anObject cannot be accessed
// because they are local variables of the functions X() / Z()
var b = Z('baz', a);

// a is now the same as b, they both reference the same var
// a.foo and b.foo both are set to 'baz'
4 голосов
/ 08 февраля 2011

anObject и objectX оба ссылаются на одно и то же пространство в памяти, поэтому назовите его как хотите, это всегда один и тот же объект.

Удачи!

2 голосов
/ 08 февраля 2011

Я считаю, что пример - лучший способ обучения.Вот некоторый код ( нажмите здесь , чтобы увидеть его в JS Bin):

// Defines the variable to keep track of how many objects X() defines.
var num = 1;

// Instantiate another variable to see if it is changed by Z().
var anObject;

// Creates an object with a comment and a random number.
function X() {
  // Create an object and give it a name.
  var objectX = {comment : "Creation #" + num};
  // Increase the value of num.
  num++;
  // Add another random number between 0 and 100 inclusively.
  objectX.randNum = Math.round(Math.random() * 100);
  // Return objectX.
  return objectX;
}

// Modifies the second parameter by adding the value of the first parameter.
function Z(somevar, anObject) {
  anObject.somevar = somevar;
  return anObject;
}

var objectX = X(), objectY = X();
objectX2 = Z('coolness', objectX);

// Notice that objectX is still the result of calling X() the first time.
alert("objectX.comment = " + objectX.comment);

// Notice that objectX is not equal to objectY.
alert("objectX === objectY evaluates to " + (objectX === objectY));

// Notice that objectX2 is the same thing as objectX.
alert("objectX === objectX2 evaulates to " + (objectX === objectX2));

// Notice that anObject is not defined.
alert("typeof anObject evaluates to " + (typeof anObject) + " after Z is called.");​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

alert("Now review the JavaScript code.");

Если вы прочитаете комментарии, вы найдете ответы на свои вопросы.Сначала вы заметите, что в функции Z, поскольку я передал objectX в качестве второго параметра внутри функции, на него может ссылаться объект anObject.Во-вторых, вы заметите, что когда-то вне функции Z, anObject больше не ссылается на objectX.Комментарии также показывают другие вещи, которые верны в JavaScript.

1 голос
/ 08 февраля 2011

Javascript имеет область действия .Это означает, что каждая переменная, объявленная внутри функции, будет доступна только из этой функции.

Если вы правильно объявили переменную objectX с помощью var, как показано ниже:

function X() {
    ...
    var objectX = {};
    ...
    return objectX;
}

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

Однако, вот один из более серьезных недостатков дизайна Javascript: если вы не явно объявляйте переменную (используя оператор var или как параметр функции), эта переменная автоматически станет глобальной переменной.Это означает, что он будет доступен в любом месте .

. Поэтому в приведенном выше коде вы можете получить доступ к objectX везде с этим именем.

anObjectс другой стороны, правильно объявлено (как параметр), и это означает, что его область действия будет ограничена функцией Z.

Короче говоря, способ, которым ваш коднаписано, objectX доступен везде через переменную objectX, а внутри функции Z вы можете ссылаться на нее как objectX и anObject.


Doзаметьте, однако, что глобальные переменные являются плохой вещью ™, поскольку они могут затруднить выяснение того, какая переменная назначается кем, когда и почему - как вы заметили.
Хотя Javascript делает невозможнымполностью избегайте их, как правило, вы должны стараться, чтобы область ваших переменных была как можно меньше (область видимости = где в вашей программе эта переменная может быть доступна).

С этой целью я бы рекомендовал рефакторинг вашейкод как яgorw имеет.

1 голос
/ 08 февраля 2011

Вот ссылка на jsfiddle

Давайте рассмотрим следующий пример:

Person = function(name){
 this.name = name;
}

function x(){
     var john = new Person('john');
     return john;
}

function z(tempVar, anObject){
    var newObj = anObject;
    newObj.name = tempVar;
    return newObj;
}

myPerson = x();
console.log(myPerson.name); //john
console.log(z('peter', myPerson).name);  //peter
console.log(myPerson.name); //peter

Вы можете видеть, хотя вы и создали новый объект в z, но поскольку они ссылаются на один и тот же объект, свойство name myPerson также изменяется после вызова z ().

...