diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0b2bb5d7fb5..904c927a862 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@
* Fix `{@const}` tag not working inside Component when there's no `let:` [#7189](https://github.com/sveltejs/svelte/issues/7189)
* Ignore comments in `{#each}` blocks when containing elements with `animate:` ([#3999](https://github.com/sveltejs/svelte/issues/3999))
* Add a third parameter to the returned function of `createEventDispatcher` that allows passing an object of `{ cancelable: true }` to create a cancelable custom event. The returned function when called will also return a boolean depending on whether the event is cancelled ([#7064](https://github.com/sveltejs/svelte/pull/7064))
+* Fix value of `let:` bindings not updating in certain cases ([#7440](https://github.com/sveltejs/svelte/issues/7440))
## 3.47.0
diff --git a/src/compiler/compile/nodes/shared/Expression.ts b/src/compiler/compile/nodes/shared/Expression.ts
index 751b7395643..a773355e311 100644
--- a/src/compiler/compile/nodes/shared/Expression.ts
+++ b/src/compiler/compile/nodes/shared/Expression.ts
@@ -90,7 +90,7 @@ export default class Expression {
}
if (template_scope.is_let(name)) {
- if (!function_expression) { // TODO should this be `!lazy` ?
+ if (!lazy) {
contextual_dependencies.add(name);
dependencies.add(name);
}
diff --git a/test/runtime/samples/component-slot-let-in-slot-2/Inner.svelte b/test/runtime/samples/component-slot-let-in-slot-2/Inner.svelte
new file mode 100644
index 00000000000..d0ea817d547
--- /dev/null
+++ b/test/runtime/samples/component-slot-let-in-slot-2/Inner.svelte
@@ -0,0 +1 @@
+
diff --git a/test/runtime/samples/component-slot-let-in-slot-2/Outer.svelte b/test/runtime/samples/component-slot-let-in-slot-2/Outer.svelte
new file mode 100644
index 00000000000..590a70564a8
--- /dev/null
+++ b/test/runtime/samples/component-slot-let-in-slot-2/Outer.svelte
@@ -0,0 +1,5 @@
+
+
+
diff --git a/test/runtime/samples/component-slot-let-in-slot-2/_config.js b/test/runtime/samples/component-slot-let-in-slot-2/_config.js
new file mode 100644
index 00000000000..96c43497dbd
--- /dev/null
+++ b/test/runtime/samples/component-slot-let-in-slot-2/_config.js
@@ -0,0 +1,25 @@
+let logs;
+function log(value) {
+ logs.push(value);
+}
+
+export default {
+ props: {
+ prop: 'a',
+ log
+ },
+ html: '',
+ before_test() {
+ logs = [];
+ },
+ async test({ assert, component, target, window }) {
+ const button = target.querySelector('button');
+ await button.dispatchEvent(new window.MouseEvent('click'));
+
+ assert.deepEqual(logs, ['a']);
+
+ component.prop = 'b';
+ await button.dispatchEvent(new window.MouseEvent('click'));
+ assert.deepEqual(logs, ['a', 'b']);
+ }
+};
diff --git a/test/runtime/samples/component-slot-let-in-slot-2/main.svelte b/test/runtime/samples/component-slot-let-in-slot-2/main.svelte
new file mode 100644
index 00000000000..214b0895aee
--- /dev/null
+++ b/test/runtime/samples/component-slot-let-in-slot-2/main.svelte
@@ -0,0 +1,11 @@
+
+
+
+
+