When you test a condition in construct -- did foo collide with dragon? -- any actions you take within that event only affect the instances that fulfill that condition -- the dragon that was hit.
However, when you call a function, the function itself doesn't know anything about the condition that led to it being called.
Now, you can tell the function, but that requires passing it some data that allows it find the instance again. This is called the uid. You feed this to the function by passing it as a parameter, and you select the object by 'picking' it, using the condition pick by uid within the function.
An easier way of going about this, in most cases, is to use families to test for collision events, allowing you to minimize redundant events, while still having multiple object types.