I guess Max and Min are the best fit for discrete lists.
f[x_] := x Sin[x];
list = RandomReal[10, 10^6];
(Position[#, Max[#], 2][[1, 1]]) &@(f /@ list)
One can forcefully use NArgMax or NArgMin for this purpose but they are likely to be extremely inefficient! One such example
list = RandomReal[10, 1000];
ob[i_?IntegerQ] := (f /@ list)[[i]];
ob@NArgMax[{Evaluate@ob[x],1<= x<= Length@list&&Element[x,Integers]},x]//AbsoluteTiming
{5.8344103, 7.91672}
Where as
Max[f /@ list]// AbsoluteTiming
{0., 7.91672}
For timing comparison with solution using Ordering see the following plot. Horizontal axes shows the data length of list and the vertical axes is denoting computation time in seconds. I have tested it in an Intel i7 PC with 64 GB RAM.

As one can see if you compile the functions you get even better speed ups.
cf=Compile[{{x,_Real,1}},
Module[{listval,max},
listval=# Sin[#]&/@x;
max=Max[listval];
(Position[listval,max])[[1,1]]
],
CompilationTarget->"C",
RuntimeAttributes->{Listable},Parallelization->True];
Ordering[list, 1]is more efficient thanFirst@Ordering[list]– Szabolcs Feb 11 '13 at 19:40