2016-07-01 4 views
0

を使用して利用するキットで私が悪用キット難読化Javascriptが配列のコンストラクタ

> a = []["constructor"] 
Array() { [native code] } 
> b = a["constructor"] 
Function() { [native code] } 
> b("console.log('a');") 
anonymous() { 
    console.log('a'); 
} 
> b("console.log('a');")() 
a 

または他の言葉で

> [].constructor.constructor("console.log('a');")() 
a 

にいくつかの難読化Javascriptを気づいた誰かがここで何が起こっているのか説明できますか?配列のコンストラクタのコンストラクタは何ですか?

+1

JSコンソールに '[] .constructor.constructor'と入力して、自分で見つけ出すことができます。 –

+0

好奇心をそそる場合は、 'Function'のコンストラクタも' Function'ですので、それ以上の循環関係です。 'Function'のための[MDNページ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function) – 4castle

+0

はい、これはJSコンソールの出力です。ここのキー(私が欠けていた)は、関数プロトタイプは文字列リテラルをとり、それを評価します。 –

答えて

1
[].constructor.constructor("console.log('a');")() 

..だからこれは何ですか?

[].constructor.constructor 

関数(){[ネイティブコード]}

AHHA ...それはevalに文字列を取りFunctionコンストラクタを呼び出すためだけの方法であるので、...次いで最後のparensはそれを呼び出します。

Function("console.log('a')")() // Works with or without `new` 

+0

ありがとうございます。コンストラクタのプロトタイプnew Function([arg1 [、arg2 [、... argN]]、functionBody) 参照:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /関数 –

0

あなたは、任意のJSコンソールに[].constructor.constructorを入力して、自分のために見つけることができます。

[].constructor 
    -> Array() { [native code] } 
[].constructor.constructor 
    -> Function() { [native code] } 
[].constructor.constructor("console.log('a');")() 
-> a