2016-04-22 2 views
0

Для контекста, я смотрю на пакет npm unique-random. Это всего восемь строк кода, так что, в полном комплекте:Объясните это утверждение `return`?

'use strict'; 
module.exports = function (min, max) { 
    var prev; 
    return function rand() { 
     var num = Math.floor(Math.random() * (max - min + 1) + min); 
     return prev = num === prev && min !== max ? rand() : num; 
    }; 
}; 

Я понимаю, большинство того, что происходит, я просто не совсем уверен, что делает окончательное возвращение заявление.

Может ли кто-нибудь объяснить это как можно яснее (я действительно новичок в JavaScript и кодировании вообще).

Возможно, это может быть общий вопрос о том, что происходит в операциях return, которые также выглядят как присвоений? Правильно?

Итак, есть условный оператор. И это говорит, что то, что слева от ?, верно, то что слева от :, иначе что находится справа от :. Итак, если num === prev и min !== max, назначьте rand()prev, иначе назначьте num на prev?

Это правильно?

+1

Это создает случайное число, но проверяет, является ли это случайное число, такое же, как в последний раз был сгенерирован случайным числом. Если это фактически то же число, что и в последний раз, он снова вызывает 'rand()', иначе он возвращает 'num'. – h2ooooooo

+0

Вы правы, плюс то, что @ h2ooooooo^сказал. – BenG

+0

Может ли кто-нибудь описать, как должно работать условие 'prev = num === num'? Я не вижу, как он может оценивать что-либо еще, чем 'true' – Aaron

ответ

3

В основном, этот модуль возвращает функцию:

module.exports = function() { 
    return function rand() { 
     // stuff 
    }; 
}; 

Так, при импорте этого модуля вы должны назвать то, что вы получите:

var rand = import('./rand'); 
rand(); // stuff 

Тогда функция рэнд состоит из двух частей:

var num = Math.floor(Math.random() * (max - min + 1) + min); 

Вычислить случайное значение между min и max.

return prev = num === prev && min !== max ? rand() : num; 

Убедитесь, что новый Num не то же самое, что и предыдущий, и сохранить новое значение в ПРЕД вы можете увидеть его следующим образом:

if (num === prev && min !== max){ 
    prev = rand(); 
} else { 
    prev = num; 
} 
return prev; 

Я добавлю, что переменная prev является в закрытии модуля, поэтому он доступен из области rand, поэтому каждый вызов rand будет иметь новое значение prev.

(это не строго говоря, один и тот же код, но он должен делать то же самое)

0

Это идеальный пример кода, который мог бы использовать скобки. То же самое можно записать в следующем виде, который пояснит:

return prev = (num === prev && min !== max)? rand() : num; 

Это включает в себя назначение и троичной операции (ху: г), которая работает точно так, как вы описали.Если x истинно, то y, else z;

Это все можно записать в следующем виде, которые могли бы сделать его еще более ясно:

if (num === prev && min !== max){ 
    prev = rand(); 
} 
else { 
    prev = num; 
} 
return prev; 
Смежные вопросы