Some languages (Javascript, Python) have the notion that a function is an object: //Javascript var fn = console.log; This means that functions can be treated like any other object ([first-class functions](https://en.wikipedia.org/wiki/First-class_function)), e.g. passed in as arguments to another function: var invoker = function(toInvoke) { toInvoke(); }; invoker(fn); //will call console.log Other languages (C++, C#, VB.NET) do not define functions as real objects, but rather have objects which can point to a function (such as C++ function pointers) and can be passed around just like any other object. In the CLI, these wrapper objects are called **delegates** or **delegate instances**: //C# void Invoker(Action toInvoke) { toInvoke(); } Action action = Console.WriteLine; Invoker(action); //also valid, and the toIvoke argument will now contain a pointer to Console.WriteLine //Invoker(Console.WriteLine); What differences in capability arise from these two mechanisms -- "function object" vs "pointer-to-function as object"?