2016-06-12 2 views
0

Почему верхняя версия не работает и работает нижняя функция? Изучение того, как создавать и использовать объекты, и это меня озадачивает. Я предполагаю, что это связано с тем, что я использую объект в верхней части?function variable undefined

var slot1 = { 
 
    coffee: '1', 
 
    tea: '2', 
 
    espresso: '3' 
 
} 
 

 
function findItem(obj, prop){ 
 
    var item = obj + '.' + prop; 
 
    console.log(item); 
 
} 
 
findItem(slot1, coffee); 
 

 

 
function addNumbs(num1,num2){ 
 
\t var answer = num1+num2; 
 
    console.log(answer); 
 
} 
 
addNumbs(4,3);

Право, когда я думаю, что я получаю повесить его я получаю полностью пощечину!

+0

Я думаю, что вы выиграли бы от чтения учебника JavaScript: http://eloquentjavascript.net /04_data.html. Здесь немало вещей. –

+0

Спасибо за чтение @FelixKling! Мне нужно больше таких вещей ... Любые другие новички будут потрясающе кстати;) – user1607991

ответ

2

Проблема в том, что кофе не определен в какой-либо области как переменная, вы можете использовать обозначение obj ['coffee'], передавая кофе в виде строки, чтобы это работало. Или вы можете называть его слот-кофейником, чтобы вы могли добраться до него.

2

Верхняя версия не работает из-за этих двух линий

var item = obj + '.' + prop; & findItem(slot1, coffee);

При получении объекта a.b или a['b'] достаточно, где находится объект и б является ключевым

Двигаемся + '.' + b приведет к конкатенации, вместо того, чтобы извлекать значение.

В функции пропуска coffee как строка в противном случае она будет проходить, как неопределенное значение, так как он будет предполагать кофе объявлен где-то что не

Сделать это изменение

var slot1 = { 
    coffee: '1', 
    tea: '2', 
    espresso: '3' 
} 

function findItem(obj, prop){ 
    var item = obj[prop]; 
    document.write('<pre>'+item+'</pre>') 
} 
findItem(slot1,'coffee'); 

DEMO

+0

О, ладно ... Я понимаю. Я смотрел учебник, хотя, и они возвращали значения из объекта, такого как slot1, используя точечный синтаксис ... например, slot1.coffee вернул 1. правильный способ вернуть свойство через slot1 ['coffee'] ?? Извинения за nub-ness: \ – user1607991

+0

@ user1607991: 'foo.bar' эквивалентно' foo ['bar'] '. Вы можете использовать оба. –

1

Попробуйте использовать slot1.coffee вместо кофе

findItem(slot1, slot1.coffee); 
1

Когда у вас есть имя свойства в переменной, используйте объект как массив myObject[property] где свойство - это переменная, которая содержит имя свойства объекта, на которое вы хотите получить значение.

Кроме того, coffee не следует использовать в качестве переменной, но строка "coffee" или 'coffee'

var slot1 = { 
 
    coffee: '1', 
 
    tea: '2', 
 
    espresso: '3' 
 
} 
 

 
function findItem(obj, prop){ 
 
    var item = obj[prop]; // You need to access object property as if object was an array when you have property name in variable. 
 
    console.log(item); 
 
} 
 
findItem(slot1, 'coffee'); // You need coffee as a string here, variable coffee was never defined 
 

 

 
function addNumbs(num1,num2){ 
 
\t var answer = num1+num2; 
 
    console.log(answer); 
 
} 
 
addNumbs(4,3);

+0

Хорошо, поэтому нижнее num2 работало, потому что 3 - это число, и оно знало, что это не переменная ... Я думал, что вы можете поместить все в круглую скобку, и он рассматривал ее как объявление пустой переменной (если это имеет смысл). спасибо – user1607991

+0

Ну ... цифры могут быть объявлены похотью типа этого типа в 25, а js будет знать это 25 целое ...но со строками вы должны иметь их в кавычках иначе он будет конфликтовать с именами переменных ... как в вашем примере, 'slot1' - это переменная, содержащая объект, но' 'slot1'' будет строкой. – shramee

+0

Когда вы вводите 'coffee', он пытается найти переменную с именем' coffee', но она не может найти ее где-нибудь, следовательно, ошибку. Однако, когда вы печатаете «кофе», он знает, что вы говорите о струне, говорящей о кофе. – shramee