これが以前に機能した理由は、以前のバージョンの ECMAScript で、 this 値がグローバル オブジェクト (つまりwindow
) になるように指定されていたためです。ただし、ECMAScript 5 以降、 this の値は になりundefined
、makeArray.prototype.concat
はエラーをスローします。
ES3 では、ネイティブ関数がorのthis
値で呼び出された場合 ( を使用して呼び出した場合など)、関数にグローバル オブジェクトが提供されます。undefined
null
func()
ES5 では、ネイティブ関数の動作が変更され、コードが厳密モードでなくても、実際のundefined
または値を取得できるようになりました。null
2 つの違いは、1 つは関数の値であり、したがって間接的に呼び出されるのに対し、もう 1 つは関数への参照であることです。
GetValue()
は、変数から参照の値を取得する内部関数です。これは、「直接」呼び出すときは呼び出されませんが、別の変数に代入してその結果を使用するときは、実際に呼び出されます ( source )。
2 つの違いの悪名高い例は、次の使用時eval()
です。
var a = 0;
function test()
{ var a = 1, b;
console.log(eval("a")); // 1
console.log((b=eval)("a")); // 0
}
test();
ただし、あなたの例では、次のように機能します。
var a = [].concat;
// called as variable, not property
a(); // therefore it's global
// same as the following, as all these expressions call GetValue() interally
(0, [].concat)();
(random = [].concat)();
([].concat || 0)();
// but this doesn't work
[].concat(); // `this` is the new array, not global object