1. Action is QTP Specific can't use it outside qtp whereas a function is a more generic form of language construct.
2. Action can only accept or pass primitive datatypes like string and numeric while a function can pass almost any form of datatype like test objects etc.
3. We can't place calls to an existing Action using QTP API we can do this using the interface only. Functions can be called anywhere