Array
どちらの例でも、変数を にfunction
代入this
すると定義していますsecrets
。たまたま、ページ内の他の JS が配列を作成するためにArray
として使用する場合と使用しない場合があるというグローバル オブジェクトが既に存在することがあります。Constructor
コンソールを開いて Array を別のものに再割り当てすると、 に明示的に依存するコードからエラーが発生し始める可能性がありますArray
。ただし、文字どおり で作成された配列は[]
問題なく動作し続けます。実際、それらは__proto__
依然としてArray.prototype
. そう:
var arr1 = new Array('a','b','c');
// arr[0] -> 'a'
var arr2 = ['d','e','f'];
// arr[0] -> 'd'
var secrets;
Array = function() { secrets = this; };
var arr3 = new Array('g','h','i'); // nothing wrong here, because Array is a function
// arr3[0] -> undefined
// Array is just a function, you can't make arrays with new Array anymore
// and arr3 is just a function
var arr4 = ['j','k','l'];
// arr4[0] -> 'j'
// making array literals still works
に関してはthis
、奇妙なことは何もありませんが、依然として のルールに従いますthis
。関数を割り当てているという事実は、 の動作Array
を変更しませんthis
。soは、インスタンス化するか、またはを使用しない限り、ブラウザーthis
にあるグローバルオブジェクトを指しますwindow
new
call
apply
両方のサンプルの違いは、関数式と関数宣言の違いです。参照: Javascript での関数式と宣言の違いは何ですか?