Прежде всего, это ужасный код.Это может сломаться при малейшем изменении.Давайте начнем с первой строки.
var products = [
Объявляет переменную в глобальном контексте.Постарайся избежать этого.Все, что происходит в глобальном контексте, может сломаться.Кроме того, инкапсуляция данных помогает повысить модульность кода, что, в свою очередь, позволяет повторно использовать код.
Давайте рассмотрим функцию find ():
module.exports.find = function(id) {
id = parseInt(id, 10);
var found = null;
productloop: for(product_index in products) {
var product = products[product_index];
if (product.id == id) {
found = product;
break productloop;
}
};
return found;
}
В JavaScript, блоки не вводят область.Есть только функция-область.Переменная, введенная в любом месте функции, видна везде в функции.Блоки JavaScript сбивают с толку опытных программистов и приводят к ошибкам, потому что знакомый синтаксис дает ложное обещание.
Так что это (var product = products[product_index];
) объявление фактически не объявляет новую переменную каждую итерацию.
Далее.
product.id == id
Операторы == и! = Выполняют приведение типов перед сравнением.Это плохо, потому что это заставляет '\ t \ r \ n' == 0 быть верным.Это может маскировать ошибки типа.В случае функции find () оператор == не приводит к ошибке, но это место, где ошибка может появиться при изменении кода.Всегда используйте оператор ===.
for(product_index in products)
Оператор for in позволяет циклически проходить имена всех свойств объекта.К сожалению, он также просматривает все свойства, которые были унаследованы через цепочку прототипов.У этого есть плохой побочный эффект обслуживания функций метода, когда интерес к свойствам данных.Если программа написана без осознания этой ситуации, она может потерпеть неудачу.
Тело каждого оператора for in должно быть заключено в оператор if, выполняющий фильтрацию.Он может выбирать для определенного типа или диапазона значений, или он может исключать функции, или он может исключать свойства из прототипа.Например,
for (name in object) {
if (object.hasOwnProperty(name)) {
....
}
}
В вашем коде «products» - это массив, поэтому вы можете быть уверены, что у него нет дополнительных свойств.Но!Products - это глобальная переменная, поэтому в действительности это может быть что угодно.
Я немного переписал функцию и объяснил, что делает этот код.
module.exports.find = function(id) {
var found = null,
product;
id = parseInt(id, 10);
for (product_index in products) {
if (products.hasOwnProperty(product_index)){
product = products[product_index];
if (product.id === id) {
found = product;
break;
}
}
};
return found;
}
Все просто.Функция принимает идентификатор продукта в качестве аргумента (function(id)
), превращает его в число (id = parseInt(id, 10);
).Затем проходит через массив продуктов один за другим с циклом (for(product_index in products)
), проверяя равенство переданного идентификатору функции и идентификатору текущего продукта (if (product.id == id)
).Если они равны, прекращает итерацию (break;
), присваивает значение текущего произведения переменной «found» (found = product;
) и возвращает результат вызывающей функции (return found;
).
PS Я действительно плохо знаю английский, поэтому, пожалуйста, прости меня за возможные ошибки.