diff --git a/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts b/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts
index 97199a71c2e3..8a9830b01b6b 100644
--- a/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts
+++ b/src/compiler/compile/render_dom/wrappers/shared/bind_this.ts
@@ -55,6 +55,9 @@ export default function bind_this(component: Component, block: Block, binding: B
const args = [];
for (const id of contextual_dependencies) {
args.push(id);
+ if (block.variables.has(id.name)) {
+ if (block.renderer.context_lookup.get(id.name).is_contextual) continue;
+ }
block.add_variable(id, block.renderer.reference(id.name));
}
diff --git a/test/runtime/samples/binding-this-each-object-props/_config.js b/test/runtime/samples/binding-this-each-object-props/_config.js
new file mode 100644
index 000000000000..5372667b82b6
--- /dev/null
+++ b/test/runtime/samples/binding-this-each-object-props/_config.js
@@ -0,0 +1,14 @@
+export default {
+ html: ``,
+
+ async test({ assert, component, target }) {
+ component.visible = true;
+ assert.htmlEqual(target.innerHTML, `
+
b
b
c
c
+ `);
+ assert.equal(component.items1[1], target.querySelector('div'));
+ assert.equal(component.items2[1], target.querySelector('div:nth-child(2)'));
+ assert.equal(component.items1[2], target.querySelector('div:nth-child(3)'));
+ assert.equal(component.items2[2], target.querySelector('div:last-child'));
+ }
+};
diff --git a/test/runtime/samples/binding-this-each-object-props/main.svelte b/test/runtime/samples/binding-this-each-object-props/main.svelte
new file mode 100644
index 000000000000..9654a5841818
--- /dev/null
+++ b/test/runtime/samples/binding-this-each-object-props/main.svelte
@@ -0,0 +1,13 @@
+
+
+{#each data as item (item.id)}
+ {item.text}
+ {item.text}
+{/each}
diff --git a/test/runtime/samples/binding-this-each-object-spread/_config.js b/test/runtime/samples/binding-this-each-object-spread/_config.js
new file mode 100644
index 000000000000..cecec08db903
--- /dev/null
+++ b/test/runtime/samples/binding-this-each-object-spread/_config.js
@@ -0,0 +1,14 @@
+export default {
+ html: ``,
+
+ async test({ assert, component, target }) {
+ component.visible = true;
+ assert.htmlEqual(target.innerHTML, `
+ a
a
b
b
+ `);
+ assert.equal(component.items1[1], target.querySelector('div'));
+ assert.equal(component.items2[1], target.querySelector('div:nth-child(2)'));
+ assert.equal(component.items1[2], target.querySelector('div:nth-child(3)'));
+ assert.equal(component.items2[2], target.querySelector('div:last-child'));
+ }
+};
diff --git a/test/runtime/samples/binding-this-each-object-spread/main.svelte b/test/runtime/samples/binding-this-each-object-spread/main.svelte
new file mode 100644
index 000000000000..256ed0ede6e8
--- /dev/null
+++ b/test/runtime/samples/binding-this-each-object-spread/main.svelte
@@ -0,0 +1,13 @@
+
+
+{#each data as {id, text} (id)}
+ {text}
+ {text}
+{/each}