| Index: pkg/compiler/lib/src/js_model/closure.dart | 
| diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart | 
| index 0d9a9df1764227379ffeda3a30605821a994d4bf..b80c91da0b74833d0717d27551bd243671490004 100644 | 
| --- a/pkg/compiler/lib/src/js_model/closure.dart | 
| +++ b/pkg/compiler/lib/src/js_model/closure.dart | 
| @@ -253,6 +253,11 @@ class KernelScopeInfo { | 
| /// this scope. | 
| Set<ir.VariableDeclaration> freeVariables = new Set<ir.VariableDeclaration>(); | 
|  | 
| +  /// If true, `this` is used as a free variable, in this scope. It is stored | 
| +  /// separately from [freeVariables] because there is no single | 
| +  /// `VariableDeclaration` node that represents `this`. | 
| +  bool thisUsedAsFreeVariable = false; | 
| + | 
| KernelScopeInfo(this.hasThisLocal) | 
| : localsUsedInTryOrSync = new Set<ir.VariableDeclaration>(), | 
| boxedVariables = new Set<ir.VariableDeclaration>(), | 
| @@ -294,7 +299,11 @@ class JsScopeInfo extends ScopeInfo { | 
| this.localsUsedInTryOrSync = | 
| info.localsUsedInTryOrSync.map(localsMap.getLocalVariable).toSet(), | 
| this.freeVariables = | 
| -            info.freeVariables.map(localsMap.getLocalVariable).toSet(); | 
| +            info.freeVariables.map(localsMap.getLocalVariable).toSet() { | 
| +    if (info.thisUsedAsFreeVariable) { | 
| +      this.freeVariables.add(this.thisLocal); | 
| +    } | 
| +  } | 
|  | 
| void forEachBoxedVariable(f(Local local, FieldEntity field)) { | 
| boxedVariables.forEach((Local l, JRecordField box) { | 
|  |