improve function invoke
add test