You can certainly do this if the CSV and the document containing the JavaScript are served from the same origin. (More: Same Origin Policy)
You'd retrieve the data using an XMLHttpRequest object, which will give it back to you as text. Then, depending on the complexity of your CSV data, it could be as simple as using String#split (spec, MDN) to get an array of lines (rows), and then using String#split again in a loop to get an array of the values for each row. I say "depending on the complexity" because CSV is a more involved format than people sometimes suspect, involving quoted cells which can contain line breaks and commas. But if your data don't use those features, just a couple of split calls will do the trick. if your data do use more features, you might need to find a library that handles parsing accoding to the full RFC.
Here's a complete example: Live Copy | Live Source
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Load CSV</title>
</head>
<body>
<script>
(function() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = handleStateChange;
xhr.open("GET", "http://jsbin.com/ocuqog/1");
xhr.send();
display("Request sent");
function handleStateChange() {
if (xhr.readyState == 4 &&
xhr.status >= 200 &&
xhr.status < 300) {
display("Got response");
showData(xhr.responseText);
}
}
function showData(data) {
var rows = data.split(/\s+/);
var rowNum;
var cells;
var cellNum;
for (rowNum = 0; rowNum < rows.length; ++rowNum) {
cells = rows[rowNum].split(",");
display("row " + rowNum +
" has " + cells.length + " values(s)");
display("row " + rowNum + "'s first value is " +
cells[0]);
}
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
</script>
</body>
</html>