diff --git a/jsre/completion.go b/jsre/completion.go
index 11e209b69e8ad78734d60b8da97086dfca82a925..7f94dabfcea8789d0f5fbd903ff8c0037743823a 100644
--- a/jsre/completion.go
+++ b/jsre/completion.go
@@ -55,9 +55,18 @@ func getCompletions(vm *otto.Otto, line string) (results []string) {
 			}
 		}
 	})
-	// e.g. web3<tab><tab> append dot since its an object
-	if obj, _ = vm.Object(line); obj != nil {
-		results = append(results, line+".")
+
+	// Append opening parenthesis (for functions) or dot (for objects)
+	// if the line itself is the only completion.
+	if len(results) == 1 && results[0] == line {
+		obj, _ := vm.Object(line)
+		if obj != nil {
+			if obj.Class() == "Function" {
+				results[0] += "("
+			} else {
+				results[0] += "."
+			}
+		}
 	}
 
 	sort.Strings(results)
diff --git a/jsre/completion_test.go b/jsre/completion_test.go
index 6d42b2bd1c608e101dc3bce1af309b86d2a09471..8765281e5e86b234cd41dc0c50b84f7a3158b9f4 100644
--- a/jsre/completion_test.go
+++ b/jsre/completion_test.go
@@ -40,7 +40,11 @@ func TestCompleteKeywords(t *testing.T) {
 	}{
 		{
 			input: "x",
-			want:  []string{"x", "x."},
+			want:  []string{"x."},
+		},
+		{
+			input: "x.someMethod",
+			want:  []string{"x.someMethod("},
 		},
 		{
 			input: "x.",