 							if (builtInSymbolTable.hasOwnProperty(symbolName))
 								throw new Error("Cannot assign built-in symbol: " + symbolName);
 							
+							// find the most local symbol table that has the variable
+							for (i = LOCAL_SYMBOL_TABLE_INDEX; i <= THIS_SYMBOL_TABLE_INDEX; i++)
+								if (allSymbolTables[i] && allSymbolTables[i].hasOwnProperty(symbolName))
+									break;
+							// if no symbol table has the variable, create a new local variable
+							if (i > THIS_SYMBOL_TABLE_INDEX)
+								i = LOCAL_SYMBOL_TABLE_INDEX;
+							
 							// assignment operator expects parameters like (host, ...chain, value)
-							// if there is no matching local variable and 'this' has a matching one, assign the property of 'this'
-							if (useThisScope && this && this.hasOwnProperty(symbolName) && !localSymbolTable.hasOwnProperty(symbolName))
-								result = method(this, symbolName, call.evaluatedParams[1]);
-							else // otherwise, assign local variable
-								result = method(localSymbolTable, symbolName, call.evaluatedParams[1]);
+							result = method(allSymbolTables[i], symbolName, call.evaluatedParams[1]);
 						}
 						else if (method is Class)
 						{

				"for (i = 0; i < 10; i++) { if (i == 3) continue; trace(i); if (i == 5) break; } trace('done');",
				"i = 0; do { if (i == 3) continue; trace(i); if (i == 5) break; } while (i >= 0 && ++i < 10) trace('done');",
				"i = -1; while (++i < 10) { if (i == 3) continue; trace(i); if (i == 5) break; } trace('done');",
				"a = []; o = Object('a',1,'b',2,'c',3,'d',4,'e',5); for (k in o) { a.push(`{k} = {o[k]}`); o['?'+k]=k+'!'; delete o[k]; } for each (p in o) a.push(p); return [a,o];"
			];
			var values:Array = [-2, -1, -0.5, 0, 0.5, 1, 2];
			var vars:Object = {};

					a.push(k);
				return a;
			};
			operators[ST_VAR] = function(..._):*{};
			// loop statements
			operators[ST_DO] = function(x:*, y:*):* { return x && y; };
			operators[ST_WHILE] = function(x:*, y:*):* { return x && y; };
