5

JavaScript デバッグ セッションの途中で、次のような動作が見られます。

o // function (a1, a2, a3) {  return a1 + a2 + a3; }

typeof(o) //'function'

for (var n in o) { console.log(n); } //<a list of properties>

Object.keys(o) //TypeError: not an object

Object.prototype.toString.call(o); //"[object Function]"

これは私を驚かせます-関数はオブジェクトにならないことがありますか?

[Mac 上の Chrome 29 で実行]


これは非常に複雑なデバッグ セッションの途中であることに注意してください。「o」がどこから来たのか、どのように作成されたのかは正確にはわかりません。また、これまでのところ、簡単なテスト ケースでこの問題を再現することはできませんでした。簡単なセットアップは期待どおりに機能します。

var t = function() { return true; } //undefined
t.a = "aa" //"aa"
Object.keys(t) //["a"]
4

2 に答える 2

2

Object.keys アルゴリズムによって実行される最初のステップは次のとおりです。

  1. Type( O ) が Object でない場合、TypeError例外をスローします。

このようなエラーが発生しているため、Bergiが上でコメントしたように、オブジェクトはホストオブジェクトである必要があると思います。それでも、ホスト オブジェクトはプロパティ値として "Function" を使用することが許可されていないため、"[object Function]" を指定しているのは奇妙です。Object.prototype.toString.call(o)[[Class]]

* の意味については、仕様のセクション 8Type(x)の最後の文を参照してください。

于 2013-09-17T18:55:29.910 に答える