Voltage and current are not independent, they are tied together along the LEDs I/V curve.
Every LED has a V/I curve. It is roughly a logarithmic shape. If you look at it from a voltage standpoint, small changes in voltage across the LED cause large changes in current through the LED. Likewise, large changes in current cause smaller changes in voltage across the LED (Vf).
Here is a plot of the Vf of several Luxeon I and V LEDs vs. varying levels of drive current:
Note that the Vf for a Luxeon I is just under 3V at 30mA, and just under 4V at 1A. It's also not linear. Also, notice that the curves are different for each sample. Some are quite close, but they can still be different.
The problem with looking at LEDs as voltage devices is that LEDs don't have one voltage specification. You will always get a typical or range of values that the Vf (forward voltage) of an LED will be at given its rated current. For example, given 1,000,000 Luxeon LEDs, there is no one voltage that will drive every luxeon at its rated current. Every single Luxeon (and LED, for that matter) is unique, both in its forward voltage, I/V curve, brightness, color, etc.
However, they all have the same current specification - 350mA. Every luxeon(I) on the planet is driven to spec if it is driven with a constant current supply set at 350mA. If you took the Vf for one sample, and used that as a voltage source, you'd underdrive some and overdrive others. Also, since Vf changes over the life of the luxeon, driving them with a voltage source will cause the current to increase over the life of the luxeon. However, a proper constant current source will deliver the exact same current to any Luxeon, regardless of Vf. See why current regulation is the preferred solution?
LED brightness is determined by the current flowing through the LED. Vf can affect it slightly, as a higher Vf means the LED is dissipating more power at the junction. More power dissipation means a hotter junction, and a hotter junction produces less photons given the same current flowing across the junction. In addition, all things being equal, a lower Vf LED requires less power (when using a switching converter), and will be slightly more efficient.
As to how resistors limit current:
When current flows through a resistor, it drops voltage according to Ohm's law, V=I*R. The sum of the voltage across the resistor, plus the voltage across the LED, must equal the voltage from the power source (batteries). Since the resistor and LED are in series, the same current flows through both. Some of the voltage is dropped in the resistor, and the remaining voltage must be across the LED.
The typical formula for figuring out the proper resistor is R=(Vin-Vf)/Current
Where Vf,Current is a point on the I/V curve above. Note, that it would be impossible to work out a solution with Vf=4V and current=100mA, since that point doesn't lie on the I/V curve. The Vf that you are given for an LED is the typical value given the LED's rated current. That Vf won't work out exactly for every sample, but is a best guess provided to you.
Let's take one of the Luxeons in the graph above, and work out how a resistor limits current.
Lets say we have a voltage source of 4V. If we hook that up directly to the Luxeon, there will be about 1500mA of current flowing through the Luxeon /ubbthreads/images/graemlins/eek.gif not good. That's not displayed on the above graph, but it's about right.
Now, let's put a 1 ohm resistor in series with the Luxeon to limit current. Now we sort of have to start guessing as to what the current will be. We have ohm's law to calculate what's going on with the resistor, but we must "look up" on the I/V curve for the LED to see what will really happen - and we must make some guesses, work out the solution, and see what actually works.
Okay, so 1 ohm. Let's make a guess and say it'll be 1000mA. If 1000mA were flowing through the resistor, then 1V would be dropped by the resistor, leaving 3V across the LED. Since the point 3V, 1000mA isn't on the I/V curve, we must guess again. And since the point we guessed as below the curve, we know that the guessed current was too high.
Let's guess 100mA this time. 0.1V is across the resistor, and 3.9V must be across the LED. Well, 3.9V, 100mA isn't on the curve either - it's above the curve, meaning our current guess was too low.
How about 500mA: At 500mA, 0.5V is across the resistor, and 3.5V across the LED. Now that's just about right! Just above the curve.
I'd say the real answer is about 550mA.
So, before, if I were to simply hook the LED straight to the power supply, 1500mA of current would flow through the LED. By adding the resistor, the current is now limited to 550mA. It does that by forcing the LED to operate at a different spot on the I/V curve by dropping voltage to the LED.
Larger resistances (and therefore, larger differences in Vin vs. Vf) will cause the current through the LED to change less with respect to the input voltage.
So, if I have 3 NiMH cells with 0 resistance driving one of the above Luxeons, at 3.6V, about 750mA will flow through the Luxeon. By the time the cells are dead (3.0V total), current will have dropped to about 130mA.
Now, drive the luxeon with 4 NiMH cells, and use 1.6 ohms of resistance. At 4.8V, 750mA of current will flow. When the batteries are down to 4V, about 350mA of current will still flow.
In the non-resistored version, an 0.6V change in input voltage resulted in a difference of 620mA in current. But, in the resistored version, an 0.8V change in input voltage only resulted in a 450mA change in current. The disadvantage of the resistored version is that some energy is being wasted as heat in the resistor, and you require one more battery.
Anyways, this was really long, I hope i didn't lose anyone.