diff --git a/.changeset/weak-terms-destroy.md b/.changeset/weak-terms-destroy.md
new file mode 100644
index 0000000000..eebe8bfce3
--- /dev/null
+++ b/.changeset/weak-terms-destroy.md
@@ -0,0 +1,5 @@
+---
+"svelte": patch
+---
+
+fix: visit expression node in directives
diff --git a/packages/svelte/src/compiler/phases/scope.js b/packages/svelte/src/compiler/phases/scope.js
index aae6b97549..79d7877f54 100644
--- a/packages/svelte/src/compiler/phases/scope.js
+++ b/packages/svelte/src/compiler/phases/scope.js
@@ -331,10 +331,14 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) {
 	}
 
 	/**
-	 * @type {import('zimmerframe').Visitor<import('#compiler').Directive, State, import('#compiler').SvelteNode>}
+	 * @type {import('zimmerframe').Visitor<import('#compiler').AnimateDirective | import('#compiler').TransitionDirective | import('#compiler').UseDirective, State, import('#compiler').SvelteNode>}
 	 */
-	const SvelteDirective = (node, context) => {
-		context.state.scope.reference(b.id(node.name), context.path);
+	const SvelteDirective = (node, { state, path, visit }) => {
+		state.scope.reference(b.id(node.name), path);
+
+		if (node.expression) {
+			visit(node.expression);
+		}
 	};
 
 	walk(ast, state, {
diff --git a/packages/svelte/tests/runtime-runes/samples/store-directive/main.svelte b/packages/svelte/tests/runtime-runes/samples/store-directive/main.svelte
index 48d774f39d..14166c48f2 100644
--- a/packages/svelte/tests/runtime-runes/samples/store-directive/main.svelte
+++ b/packages/svelte/tests/runtime-runes/samples/store-directive/main.svelte
@@ -1,9 +1,11 @@
 <script>
 	import { writable } from 'svelte/store';
 
-	let action = writable((node) => {
-		node.textContent = 'mounted';
+	let action = writable((node, text) => {
+		node.textContent = text;
 	});
+
+	let text = writable('mounted')
 </script>
 
-<div use:$action>hello</div>
+<div use:$action={$text}>hello</div>