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