JS は、Math、parseInt、Object、Array など、プログラムに使用できるいくつかの組み込みオブジェクト、関数、コンストラクターを提供します。これらはすべて表示されており、プログラミング中に使用できます。たとえば、新しいオブジェクトや新しい配列を使用できます。
一部は目に見えず、特殊な状況でエンジンによってのみ提供されます。これらのタイプのオブジェクトは、多くの場合、機能が制限されています。ここにいくつかあります
1. 引数の型
Arguments 型では、プログラマがオブジェクトを手動で作成することはできません。つまり、 new Arguments() を実行することはできません。 オブジェクト引数は 1 つだけあります
次のようにコードをコピーします。
関数 func() {
console.log(arguments[0]) // 1
console.log(arguments.length) // 3
}
楽しい(1, 2, 3)
引数オブジェクトは関数が呼び出されたときに作成され、関数内でのみ表示および使用されます。引数は Array に非常に似ており、要素はインデックスによって取得でき、長さ属性も持っていることがわかります。ただし、配列ではありません。プッシュやポップなどの配列のメソッドはありません。引数は ES5 10.6 で定義されています。
2.bind によって返される関数は非常に特殊です。
binding は ES5 によって Function.prototype に追加された新しいメソッドです。call/apply と同様に関数上で直接呼び出されます。指定されたコンテキストとパラメータを持つ関数を返します。
次のようにコードをコピーします。
関数 func(年齢) {
console.log('名前: ' + this.name + ', 経歴: ' + 年齢)
}
var person = {名前: 'ジョン・マッカーシー'}
var f1 = func.bind(人, 'コンピュータ科学者')
f1() // 名前: ジョン・マッカーシー、経歴: コンピューター科学者
返された関数 f1 は、通常の関数と同様に括弧を使用して呼び出されていることがわかります。 すべて正常に動作しますが、次のコードは驚くでしょう。
次のようにコードをコピーします。
関数 func(年齢) {
console.log('名前: ' + this.name + ', 経歴: ' + 年齢)
}
var person = {名前: 'ジョン・マッカーシー'}
var f1 = func.bind(人, 'コンピュータ科学者')
console.log(f1.prototype) // 未定義
上記のコードと比較すると、最後の文が異なりますが、f1() は実行されませんが、f1.prototype が出力され、未定義であることがわかります。
奇妙な? すべての関数にはプロトタイプ属性がありませんか? これはプロトタイプの継承を実装するために使用されます。確かに、bind によって返される関数は特別であり、プロトタイプがありません。この特別な関数は JS エンジンによって作成され、クライアント プログラマが関数宣言や関数を通じて直接測定することはできません。
これは仕様 ES5 15.3.4.5 に明確に記載されています。