2013-07-27 3 views
3

Я изучаю javascript, используя разные книги, и я замечаю, что не могу найти адекватного объяснения того, когда именно вы используете return. Я понимаю, что вы используете его, когда вы хотите, чтобы вернуть значение из функции, но есть такие примеры, как это с помощью Javascript: The Good Parts:Когда использовать 'return' в javascript

var quo = function(status) { 
    return { 
     get_status: function() { 
      return status; 
     } 
    }; 
}; 

var myQuo = quo("amazed"); 

document.writeln(myQuo.get_status()); 

Почему статус должен быть возвращен, когда он уже доступен к функции кво в качестве аргумента? Другими словами, почему просто

return { 
    get_status: status; 
} 

не работает?

Другой пример на странице сразу же после:

var add_the_handlers = function(nodes) { 
    var helper = function(i) { 
     return function(e) { 
      alert(i); 
     }; 
    }; 
    var i; 
    for (i = 0; i<nodes.length; i+=1) { 
     nodes[i].onclick = helper(i); 
    } 
}; 

Почему мы возвращающейся тревоги (I) в функции вместо того, чтобы просто положить предупреждение (я)?

+1

Я думаю, что вы сбиваете с задержкой выполнение с немедленным. 'function() {alert()}' и 'alert()' не одно и то же. Кроме того, если вы сделали это 'get_status: status', теперь это свойство, а не метод (поэтому' myQuo.get_status' вместо 'myQuo.get_status()'), а также доступен только для чтения, а не для модификации. –

+1

Пример второй: вы не хотите сразу предупреждать, вы хотите оповестить позже ... Вы не возвращаете 'alert (I)', вы возвращаете функцию, которая вызывает 'alert'. –

+0

Почему он передает «e» этой функции? –

ответ

10
return { 
    get_status: status 
} 

не будет определять геттер, то есть функцию, возвращающую базовое значение. Он будет определять только свойство.

Вы могли бы использовать его в качестве

var status = quo.get_status; 

И любой пользователь может изменить статус с

quo.get_status = 'new status directly changed'; 

Одна из причин использовать

return { 
    get_status: function() { 
     return status; 
    } 
}; 

является то, что она делает status частный : пользователи объекта quo не могут изменить внутренний status свойство quo объекта, они могут только читать его с

var status = quo.get_status(); 
1

Что вы видите в этом примере - демонстрация закрытия (see) и status сохраняется внутри объекта, как частная переменная.

1

Я не буду спорить о том, почему код, как это кажется -это слишком сложным для меня слишком- но вниз к технической стороне вещей :

return { 
    get_status: function() { 
     return status; 
    } 
}; 

Это возвращает функцию в свойстве get_status, что вызывающий кво может называть всякий раз, когда ему угодно (x.get_status()).

return { 
    get_status: status; 
} 

Это не является допустимым JavaScript, если вы настраиваете его

return { 
    get_status: status 
}; 

кво будет возвращать объект с одной строки свойство с именем get_status вместо этого. И это тоже сработает! Вы просто получите значение по-разному.

проверьте следующее (не очень элегантно) JSFiddle: http://jsfiddle.net/edw6a/1/

1

Первый пример может быть полезным, если, например, вы хотите, чтобы добавить некоторые ограничения на status. Обратите внимание, что get_status не должен вызываться из quo.

var quo = function(status) { 
    return { 
     get_status: function() { 
      return status; 
     } 
     set_status: function(newValue) { 
      if (newValue === 2 || newValue === 0) { 
       status = newValue; 
      } 
     } 
    }; 
}; 

Второй пример - «производитель функций». Помощник возвращает другую функцию в зависимости от переданного значения. Позже этот пример связывает эти «сделанные» функции, чтобы щелкнуть события. Просто запись alert(i); создаст предупреждения во время цикла.

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