If the layer is added to the map as a FeatureLayer then yes you can just get the features on the client. If the layer you are interested in is a layer from a ArcGISDynamicMapServiceLayer then the client has no information about individual features it only has an image of the mapservice from the server.

The only reason I can think that the FeatureLayer.graphics would be a zero length is that you are checking the length of the graphics before the layer is finished loading. Make sure you call the FeatureLayer.graphics after the load event for the FeatureLayer has fired.

To get the graphics that are only in the maps visible extent you will have to do a query on the FL using that maps extent property.

In on-demand mode, the feature layer retrieves features from the server when needed. This is based on the requirements defined in the following properties:

Map properties such as the current spatial extent and time extent.

Layer properties such as time offset and definition expression.

MODE_SELECTION

In selection mode, features are retrieved from the server only when they are selected. Features are available on the client only while they are selected. To work with selected features:

Call the selectFeatures method.

Listen for the onSelectionComplete event.

Once onSelectionComplete fires, retrieve the selected features using the getSelectedFeatures method.

When editing feature layers in selection mode, you will need to add the map service associated with the feature service to the map as a dynamic map service. If you do not have the map service added as a dynamic map service then the changes will not be visible because once the edits are complete the feature is no longer selected.

MODE_SNAPSHOT

In snapshot mode, the feature layer retrieves all the features from the associated layer resource and displays them as graphics on the client. Definition expressions and time definitions are honored. The features are retrieved once the feature layer is added to the map. After the onUpdateEnd event has fired, you can access the features using the graphics property of the layer or through selection and query operations.

No, visibility is not required, but like Robert said you must wait until the features are completely loaded and the definition query set. I've tested the principle of iterating through the featurelayer graphics and it works. For my test example the MODE_ONDEMAND was used.