7

次のコードがあるとします。

var secrets;
Array = function() {
  secrets = this;
};

上記のサンプルの作成者は、コードが Array コンストラクターを再定義していると述べています。まず、何をthis指しているのかよくわかりません。誰でもアドバイスできますか?

2番目:次のコードは同等ですか?

var secrets;
function Array() {
  secrets = this;
}

ちなみに、上記のコードは、Json の脆弱性に関する次の記事から引用したものです。こちらを参照してください。

4

2 に答える 2

5

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 での関数式と宣言の違いは何ですか?

于 2013-03-13T13:09:07.467 に答える
1

はい、両方のスニペットは同等です。リンクされた記事で説明されているように、どちらも配列コンストラクターを再定義し、それが注入された Web サイトで使用されるすべての配列データを傍受しようとします。の値はthis、新しく構築された配列であると想定されています。

これは ECMAScript 3 では許可されていたようですが、ECMAScript 5 では禁止されており、現在はすべての最新のブラウザーで利用できます。そのため、この記事で説明されているエクスプロイトは機能しなくなります。

于 2013-03-13T13:05:58.993 に答える