A continuación, las diferentes formas de declarar las variables en JavaScript. Comentarios y console.log debería ser suficiente para explicar lo que está pasando aquí:

var y, x = y = 1 //== var x; var y; x = y = 1
console.log('--> 1:', `x = ${x}, y = ${y}`)

// Will print
//--> 1: x = 1, y = 1

En primer lugar, apenas fijamos dos variables. No hay mucho aquí.

;(() => { 
  var x = y = 2 // == var x; x = y = 2;
  console.log('2.0:', `x = ${x}, y = ${y}`)
})()
console.log('--> 2.1:', `x = ${x}, y = ${y}`)

// Will print
//2.0: x = 2, y = 2
//--> 2.1: x = 1, y = 2

Como se puede ver, el código sólo ha cambiado la ‘y’ global, ya que no hemos declarado la variable en el closure.

;(() => { 
  var x, y = 3 // == var x; var y = 3;
  console.log('3.0:', `x = ${x}, y = ${y}`)
})()
console.log('--> 3.1:', `x = ${x}, y = ${y}`)

// Will print
//3.0: x = undefined, y = 3
//--> 3.1: x = 1, y = 2

Ahora declaramos dos variables a través var. Lo que significa que sólo viven en el contexto del closure.

;(() => { 
  var y, x = y = 4 // == var x; var y; x = y = 4
  console.log('4.0:', `x = ${x}, y = ${y}`)
})()
console.log('--> 4.1:', `x = ${x}, y = ${y}`)

// Will print
//4.0: x = 4, y = 4
//--> 4.1: x = 1, y = 2

Ambas variables han sido declaradas utilizando var y sólo después de que han puesto sus valores. Como local > global, x e y son locales en el closure, es decir, el global x e y no se tocaron.

x = 5 // == x = 5
console.log('--> 5:', `x = ${x}, y = ${y}`)

// Will print
//--> 5: x = 5, y = 2

Esta última línea es explícito por sí mismo.

Puede probar esto y ver el resultado thanks to babel.

Mas información disponible en MDN.

Agradecimientos especiales @kurtextrem por su colaboracion :)!