0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【JavaScript】console.log(console); から Yコンビネータ にまでたどり着いた話

Last updated at Posted at 2025-07-25

目次

  1. たった1行からYコンビネータにたどり着いた話
  2. まず結論:consoleはどこから来たのか?
  3. 正体:consoleは「ホスト環境からの贈り物」
  4. 見方を変える:これは「自己言及コード」だ
  5. 自己を渡す:より“深いコード”たち
  6. 技術を超えて:本質に迫る3つの問い
  7. 教える立場なら:このコードで何が教えられるか
  8. まとめ:1行で思考を深掘るということ
  9. 明日からできる“深掘りチェックリスト”
  10. さらに学びたい人へ:自己言及・Yコンビネータの沼

たった1行からYコンビネータにたどり着いた話

JavaScriptの"ふとした1行"に、深すぎる哲学と仕掛けが詰まっていた。

console.log(console);

「なんだこれ、ネタでしょ?」

そう思ったあなたへ、問いかけます。

「この1行、なぜ動くのか?」と真面目に考えたことがありますか?

  • なぜ定義してないのに使える?
  • 中身は何?どこから来た?
  • そもそも、これは"自己参照"じゃないのか?

この記事は、たった1行のコードから、環境・仕様・再帰・思考法・自己言及と、あなたの思考を深い階層へ誘います。


まず結論:consoleはどこから来たのか?

console.log(console);

このコードは「console オブジェクト」を、console.log で出力しています。

結果(Chrome):

Console {log: ƒ, error: ƒ, warn: ƒ, ...}

でもここで終わってはいけません。
これは JavaScript の言語仕様では 定義されていないオブジェクトです。
では、なぜ動くのか?


正体:consoleは「ホスト環境からの贈り物」

  • console はブラウザや Node.js が提供する、グローバルオブジェクト
  • JavaScript (ECMAScript) の仕様には、console は存在しません

実行環境が「開発者向け標準出力」として用意したものです。

確認コード:

typeof console // "object"
window.console === console // true (ブラウザ)
global.console === console // true (Node.js)

つまりこれは、環境に依存する"影の存在"。


見方を変える:これは「自己言及コード」だ

console.log(console);

──これは、「自分自身を、自分で出力している」コード。

このような自己参照・自己評価的な構造を持つコードは、再帰や関数型プログラミングの核心的な概念にもつながります。


自己を渡す:より“深いコード”たち

1. 関数に関数自身を渡すと?

function self(f) { return f(f); }
console.log(self(self));
  • これは 自己適用関数(Self-Application)
  • self(self)self(self) → …で、無限再帰
  • 結果は:
RangeError: Maximum call stack size exceeded

この構造は、Yコンビネータ(固定点コンビネータ)にも近いもの。
関数に「自分自身」を渡すことで、名前を持たない関数に再帰的性質を与えるという、非常に高度な関数構造です。


2. 自分自身を文字列化したら?

const json = JSON.stringify(JSON);
console.log(json);
  • JSON はグローバルオブジェクト
  • JSON.stringify() はオブジェクト → JSON文字列への変換

出力は:

{"parse":{},"stringify":{}}

なぜ中身が空?
関数はJSON化できないからです。
ここでも「自己を扱う難しさ」が顔を出します。


技術を超えて:本質に迫る3つの問い

1. 「これはどこから来たのか?」

→ グローバルにあるから当たり前? 本当に? 誰が定義した?

2. 「なぜこうなるのか?」

→ なぜこの出力? なぜこれは評価され、これはされないのか?

3. 「他でも応用できるか?」

→ この構造、別の言語でも使える? 再帰・自己参照のパターンは?


教える立場なら:このコードで何が教えられるか

新人や学生に見せてほしい。

console.log(console);

この1行を見せて、問いかけてみてください。

  • これって誰が定義したの?
  • なぜ使えるの?
  • 他にも「定義してないのに使える」ものってある?

「答えを教える」のではなく、「問いを投げる」。
それが、本質的な理解への導線になります。


まとめ:1行で思考を深掘るということ

console.log(console);

このコードを笑い飛ばすだけの人と、
そこから再帰・環境・自己言及の構造まで掘る人とでは、
学び方に圧倒的な差が生まれます。


明日からできる“深掘りチェックリスト”

  1. これは「なぜ」動くのか?
  2. どこで定義されてる? 誰が用意した?
  3. 環境を変えたら動く? 動かない?
  4. 他の言語だとどうなる?
  5. この構造、別の場面で応用できる?

さらに学びたい人へ:自己言及・Yコンビネータの沼

  • 関数型プログラミングの基礎(クロージャ・評価戦略)
  • Yコンビネータで学ぶ無名関数の再帰
  • 自己反映するオブジェクトとオントロジー設計

あなたの「なんとなく使っていたコード」は、思考の鏡になるかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?