Given vim: function! s:func(a, b) endfunc let s:var = 'foo' execute 'let s:var = "bar"' echomsg s:var let s:var = 'foo' function! s:func(a, b) endfunc let foo = function('s:func') let foo = function("s:func") Execute (:call lookup#lookup() cycles through script-local variables): normal! 3GwE AssertEqual [3, 9], [line('.'), col('.')] call lookup#lookup() AssertEqual [3, 7], [line('.'), col('.')] call lookup#lookup() AssertEqual [6, 7], [line('.'), col('.')] call lookup#lookup() AssertEqual [4, 16], [line('.'), col('.')] call lookup#lookup() AssertEqual [3, 7], [line('.'), col('.')] Execute (:call lookup#lookup() cycles through script-local functions): normal! 9G7w AssertEqual [9, 23], [line('.'), col('.')] call lookup#lookup() AssertEqual [7, 13], [line('.'), col('.')] call lookup#pop() normal! j AssertEqual [10, 23], [line('.'), col('.')] call lookup#lookup() AssertEqual [7, 13], [line('.'), col('.')] call lookup#lookup() AssertEqual [1, 13], [line('.'), col('.')] call lookup#lookup() AssertEqual [7, 13], [line('.'), col('.')]