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にあるグローバルオブジェクトを指しますwindownewcallapply
両方のサンプルの違いは、関数式と関数宣言の違いです。参照: Javascript での関数式と宣言の違いは何ですか?