2013-09-05 27 views
1

在代碼混淆算法,我使用這個語法看一步:高級語法:「0 [構造函數] [構造函數]()()」 - 它如何工作來評估代碼?

0["constructor"]["constructor"](
    0["constructor"]["constructor"](
     "return \"alert()\"" 
    )(); 
)(); 

我的JavaScript的知識幫我沒有更多...

typeof 0        => number 
typeof 0["constructor"]    => function 
typeof 0["constructor"]["constructor"] => function 

請,你能解釋一下什麼是JS口譯員做'處理'這個代碼? 我無法理解它的工作方式!

And:結尾「()」是什麼意思?我無法理解語法

我試着用螢火JS控制檯

執行

0["constructor"]["constructor"](
    "return \"alert()\"" 
)(); 

控制檯輸出"alert()",(帶雙引號)

我鑫卡特這相當於打到一個評估,但它不是。運行此:

eval("return \"alert()\""); 

只是導致SyntaxError: return not in function

執行這個問題的第一個片段,是完全等同於簡單地執行alert(),讓我明白代碼思文就像是一個函數體並執行它,所以正在恢復"alert()";外部讀取最後一個字符串,並認爲它是一個函數體,因此執行代碼,結果是警報觸發。

但是,我再說一遍。 這是什麼意思的語法?最後對「()」有用嗎?

0["constructor"]["constructor"](
    "some code to be evaluted" 
)(); 
+0

[閱讀點和括號標記(https://developer.mozilla.org/en -US /文檔/網絡/的JavaScript /參考/運營/ Member_Operators)。 *「最後的」()「有什麼用處?」*我不知道這應該是什麼意思,但是'()'調用了它之前的引用函數。在這種情況下'0 [「構造函數」] [「構造函數」]',我們'功能'。 –

回答

2

這個代碼是找到Function constructor,調用它來創建一個新的功能與參數作爲函數體的代碼,然後立即調用該函數:

Function("Some code to be evaluated")() 

它這樣做是兩次,一次使用String文字"return \"alert()\"",然後再以第一個函數的return值作爲第二個函數的主體。

var result = Function("Some code to be evaluated")() 
Function(result)() 

而且,它得到Function由1找到從0,然後FunctionNumberNumber

console.log(0["constructor"] === Number); // true 
console.log(Number["constructor"] === Function); // true 
+0

我跟着鏈接。我讀了這個簽名'''''''''''''''''''''''''''' ?對 ?並且使用了兩次[「構造函數」] [「構造函數」]? 但爲什麼「()」最後?是否立即執行? – realtebo

+1

@realtebo是的,是的。 :)參數將是'functionBody'。第一組圓括號用於調用構造函數,然後第二個,就是'()'用於調用由構造函數創建的新函數。 –

+1

@realtebo'[「構造函數」]'的2個用法只是引用'Function'的一種循環方式。 1st將返回'0'的構造函數,它是'Number'。然後,2nd將返回'Number'的構造函數,它是'Function'。 –