Nested Functions and Variable Scope
I get a parade of questions about which variables are available to nested functions and which variables, used in nested functions,
are part of the nesting function workspace. So today I thought I'd address this topic. For more information, you can read
this documentation.
Contents
Where is data?
Let's take a look at the following code.function blahblah % BLAHBLAH help linedata = 1;
data2 = yoyo1(); yoyo2(3);
function data = yoyo1() % Note that data is an output here data = 2 end function yoyo2(in) % Here, data is shared with the variable 'data' % in blahblah's workspace
data = in;
end endYou can see that there is the variable, in each function, named data. The question is, however, do they all refer to the same entity? And the answer is 'no.' Surprised? Let me explain. yoyo1 essentially declares data to be a local variable and not shared because of data's presence on the output argument list. The same would be true if data showed up on the input argument list instead, or if it showed up on both. However, yoyo2, which has no mention of data in its arguments lists, shared the variable data that is in blahblah's workspace. So calling yoyo2 changes the value of data in blahblah but calling yoyo1 does not.
Truisms about Variable Scope with Nested Functions
- When you call an M-file containing a nested function, sufficient analysis is done on the M-file to determine which variables are shared and which functions share them.
- If a variable is in a nested function and appears in at least one of input or output argument lists for that function, then, even if it's name matches a name in the nesting function's workspace, the two variables refer to different entities. This is true even if other nested functions share the variable in the nesting function.
- For a variable in a nested function to be shared with the nesting function, the variable must appear in the code of (i.e., be referred to or used in) nesting function. This is true even if you don't need to use the variable in the nesting function but want multiple nested functions to share the variable.
- You can't poof variables into nested function workspace. If need to do some debugging and want to create new variables, you can declare them global and then assign to them. For more detail, read the documentation about Restrictions on Assigning to Variables.