---
type: errors
language: javascript
slug: is-not-a-function
title: "TypeError: x is not a function"
title_tag: "TypeError: x is not a function の原因と直し方"
summary: >
  関数でないものを呼んだときに出ます。綴り違い、配列でない値、this の外れ、
  読み込み方の食い違いなど、原因を多い順に並べ、それぞれ直したコードを載せています。
description: >
  関数でないものを呼んだときに出ます。綴り違い、配列でない値、this の外れ、読み込み方の食い違い。原因を多い順に並べ、それぞれ直したコードを載せています。
status: published
difficulty: 2
minutes: 9

versions:
  verified: "Node 22.22.3"
  since: null
  deprecated: null
  removed: null

sources:
  - title: "EvaluateCall — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-evaluatecall"
  - title: "TypeError: \"x\" is not a function — MDN"
    url: "https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors/Not_a_function"

terms: [呼び出し, this, プロトタイプ]

links:
  related:
    - javascript/errors/cannot-read-properties-of-undefined
    - javascript/reference/array/map
    - javascript/how-to/object/merge
    - javascript/errors/unexpected-token
    - javascript/errors/maximum-call-stack
    - javascript/how-to/async/parallel
    - javascript/why/this-binding

content_updated_at: 2026-09-07
published_at: 2026-09-07
---

`()` を付けて呼んだものが、[key:関数ではなかった]ときに出ます。

```js bad
const user = { name: 'あかり' };

console.log(user.getName());
```
```output
TypeError: user.getName is not a function
```

**プロパティは読めています。** `user.getName` は `undefined` で、
それを呼ぼうとして落ちました。

[Cannot read properties of undefined](/ja/javascript/errors/cannot-read-properties-of-undefined/)
とは**止まる場所が違います**。あちらは[num:1]つ手前が `undefined` のときです。

```js run
const user = { name: 'あかり' };

console.log(user.getName);
console.log(typeof user.getName);
```
```output
undefined
undefined
```

**まず `typeof` で確かめてください。** 呼ぶ前に何が入っているかを見れば、原因はすぐ分かります。

## 原因1: 名前が違う（いちばん多い）

大文字・小文字、単数・複数、綴り。**エラー文にその名前が出ています。**

```js bad
const nums = [3, 1, 2];

console.log(nums.lenght);
console.log(nums.foreach(n => n));
```
```output
undefined
TypeError: nums.foreach is not a function
```

`length` を `lenght`、`forEach` を `foreach` と書いています。

| よくある間違い | 正しい名前 |
|---|---|
| `foreach` | `forEach` |
| `toLowercase` | `toLowerCase` |
| `lenght` | `length` |
| `push()` を文字列に | 文字列に `push` は無い |

**エラー文の名前をそのまま検索してください。** 綴り違いなら1秒で分かります。

## 原因2: そのものに、その関数が無い

型が違えば持っているものも違います。

```js bad
const text = 'あいうえお';

console.log(text.push('か'));
```
```output
TypeError: text.push is not a function
```

文字列は[key:変更できない]ので `push()` はありません。繋ぐなら `+` か `concat()` です。

```js run
const text = 'あいうえお';

console.log(text + 'か');
console.log(text.concat('か'));
console.log(text);
```
```output
あいうえおか
あいうえおか
あいうえお
```

似た形で間違えやすいものを並べます。

```js run
console.log(typeof [].map);
console.log(typeof ''.map);
console.log(typeof ({}).map);
console.log(typeof document);
```
```output
function
undefined
undefined
undefined
```

`map()` は[key:配列にしかありません]。オブジェクトや文字列にはありません。
[dim:document がここで undefined なのは、この実行環境が画面を持たないためです。ブラウザなら object になります。]

### 配列のつもりが配列でない

`Object.keys()` などで配列にしてから使います。

```js bad
const scores = { math: 80, english: 95 };

console.log(scores.map(v => v * 2));
```
```output
TypeError: scores.map is not a function
```

```js run
const scores = { math: 80, english: 95 };

console.log(Object.keys(scores));
console.log(Object.values(scores).map(v => v * 2));
console.log(Object.entries(scores).map(([k, v]) => `${k}:${v}`));
```
```output
[ 'math', 'english' ]
[ 160, 190 ]
[ 'math:80', 'english:95' ]
```

## 原因3: 同じ名前で上書きした

変数や引数が、関数と同じ名前になっていることがあります。

```js bad
function calc(sum) {
  return sum();
}

console.log(calc(10));
```
```output
TypeError: sum is not a function
```

`sum` は引数で受け取った `10` です。関数ではありません。

同じことは、あとから代入した場合にも起きます。

```js bad
let handler = () => 'ok';

handler = 'ok';

console.log(handler());
```
```output
TypeError: handler is not a function
```

## 原因4: this が外れている

メソッドを[key:関数として取り出す]と、`this` が付いてきません。

```js bad
class Counter {
  constructor() {
    this.n = 0;
  }
  add() {
    this.n += 1;
    return this.n;
  }
}

const c = new Counter();
const add = c.add;

console.log(add());
```
```output
TypeError: Cannot read properties of undefined (reading 'n')
```

この例では別のエラーになりますが、**原因は同じ**です。
`this` が外れると、`this.何か()` が `undefined is not a function` になることもあります。

```js bad
const obj = {
  items: [1, 2],
  show() {
    return this.items.join(',');
  },
};

const show = obj.show;

console.log(show());
```
```output
TypeError: Cannot read properties of undefined (reading 'join')
```

読んでいるものが `items` ではなく **`join`** になっています。ここに違いが出ます。

| 書いた場所 | 外れたときの `this` | 落ちる場所 |
|---|---|---|
| `class` の中 | `undefined`（**クラスは常に strict**） | `this.n` の時点 |
| オブジェクトリテラルのメソッド（strict でない） | `globalThis` | `this.items` は `undefined` になり、その `.join` |

上のクラスの例が `reading 'n'` で、こちらが `reading 'join'` なのはこのためです。

**モジュール（`import` / `export` のファイル）は常に strict** なので、
実際のコードではクラスと同じく `this` が `undefined` になります。
[dim:このページの実行環境は strict ではないため、globalThis のほうの結果が出ています。]

### 直しかた

呼び出しごと渡すか、`bind()` で結びつけます。

```js run
const obj = {
  items: [1, 2],
  show() {
    return this.items.join(',');
  },
};

console.log(obj.show());

const bound = obj.show.bind(obj);
console.log(bound());

const wrapped = () => obj.show();
console.log(wrapped());
```
```output
1,2
1,2
1,2
```

## 原因5: 読み込み方が食い違っている

**この環境では再現できません**（ブラウザや Node のモジュール読み込みの話です）。
起きるのは次のような形です。

```js
// 名前付きで書き出しているのに、既定として読み込んだ
import utils from './utils.js';
utils.format();          // utils は undefined になり得る

// 正しくは
import { format } from './utils.js';
format();
```

- `export default` と `export { … }` を取り違えている
- CommonJS（`module.exports`）と ES Modules（`export`）が混ざっている
- 読み込む前に呼んでいる（`<script>` の位置、`async` / `defer`）

**`console.log(読み込んだもの)` を1行入れて、何が入っているかを見てください。**
`undefined` なら読み込み側、`{}` なら書き出し側の問題です。

## 括弧を余分に付けていないか

関数が返した値を、もう一度呼んでしまう間違いです。

```js bad
function greet() {
  return 'こんにちは';
}

console.log(greet()());
```
```output
TypeError: greet(...) is not a function
```

エラー文が **`greet(...) is not a function`** になります。
`(...)` が付いていたら、[key:呼んだ結果を呼んでいる]という合図です。

関数を返す関数なら、これは正しい書き方です。

```js run
function greeter(name) {
  return () => `こんにちは、${name}`;
}

console.log(greeter('あかり')());
```
```output
こんにちは、あかり
```

## 処理系によって文言が違う

| 処理系 | 文言 |
|---|---|
| Node / Chrome（V8） | `user.getName is not a function` |
| Firefox（SpiderMonkey） | `user.getName is not a function` |
| Safari（JavaScriptCore） | `user.getName is not a function` |

**この文言はどの処理系でもほぼ同じ**です。読み替えの心配は要りません。

[dim:このページの実行結果は Node 22.22.3 のものです。]

## 探しかたの順序

1. **エラー文の名前を見る。** `x is not a function` の `x` がそのまま手がかり
2. **呼ぶ直前で `typeof` を出す。** `undefined` なら無い、`object` なら別物
3. `undefined` だったら … 綴り違い（原因1）／型が違う（原因2）／読み込み（原因5）
4. `object` や数値だったら … 同じ名前で上書きした（原因3）
5. `(...)` が付いていたら … 括弧が多い

```js run
const user = { name: 'あかり' };

console.log(typeof user.getName);
console.log(typeof user.name);
console.log(Object.keys(user));
```
```output
undefined
string
[ 'name' ]
```

`Object.keys()` で[key:実際に何を持っているか]を並べると、綴り違いはすぐ見つかります。

## ほかのエラー

- [SyntaxError: Unexpected token](/ja/javascript/errors/unexpected-token/)
  … 構文として読めない。**1行も実行されない**
- [RangeError: Maximum call stack size exceeded](/ja/javascript/errors/maximum-call-stack/)
  … 呼び出しが深すぎる。ほとんどは終わらない再帰
- [Cannot read properties of undefined](/ja/javascript/errors/cannot-read-properties-of-undefined/)
  … [num:1]つ手前が `undefined` だった
