2013-07-01 4 views
0
<body> 
<script language="javascript"> 
window.tdiff = []; fred = function(a,b){return a-b;}; 
window.onload = function(e){ 
    console.log("window.onload", e, Date.now() ,window.tdiff, 
    (window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred)); 
} 
</script> 
</body> 

Выше кода взята с сайта.пытается понять некоторые коды, связанные с window.onload in js

В firefox-> консоли, она показывает:

window.onload load 1372646227664 [undefined, 1372646227664] 1372646227664 

Вопрос:

  1. Для window.tdiff->[undefined, 1372646227664], почему: не [], потому что, когда бежит к коду: window.tdiff, он по-прежнему пустой массив?

  2. Для window.tdiff.reduce(fred)->1372646227664, window.tdiff = [undefined, 1372646227664], undefined - 1372646227664, должно быть NaN, почему он показывает 1372646227664?

ответ

1

Для window.tdiff -> [неопределен, 1372646227664], почему нет: [], потому что, когда бежит к коду: window.tdiff, это все еще пустой массив?

Это не пустой массив, когда вы говорите, код: window.tdiff вы обратитесь к точке, в которой ее передается методу в качестве параметра, а функции времени console.log оценивает значение, которое вы прошли in, это уже не пустой массив, поскольку он был заполнен следующим параметром.

> (window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred)) 

Как указано в других ответов по Arun P Johny, уменьшить не применяя Фреда() на неопределенный элемент, поэтому вы не получаете NaN

0
  1. Поскольку массив является сложным Javascript типа и его значение передается по ссылке, поэтому у вас есть [] в консоли, но в течение нескольких миллисекунд, после window.tdiff [1] = Date.now () Ваш пустой массив заменяется новым значением. Если вы будете использовать window.tdiff.slice(), вы получите пустой массив в консоли (потому что срез создает новую копию массива с новой ссылкой)
  2. Уменьшить обратный вызов просто не запускается с неопределенными (не включенными или не-инициализированное) значение. В вашем случае уменьшить просто вернуть второе значение. Чтобы увидеть, как это работает использование MDN Уменьшить раздел Совместимость по этой ссылке https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

P.S. Если добавить console.l Фреду вы будете себе, что это не вызывает

0
  1. он заполняет второй элемент массива diff перед вызовом console.log.
  2. из документации: reduce выполняет функцию обратного вызова один раз для каждого элемента, присутствующего в массиве, за исключением отверстий в массиве (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)
0

Из документации reduce исключает отверстия в массиве, и так как ваш массив имеет только один элемент, он возвращается, что в результате снижения

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