給了JavaScript下面的代碼片斷在一個範圍內的互動x'是確定的,因爲當解決x是環境走向範圍鏈時。使用JavaScript作用域鏈
你甚至可以做的「重新編譯」的水平與EVAL在運行時注入了新的領域。例如:
var x = 10;
function sayx() {
alert(x);
}
function wrap(f) {
return eval('(function() { var x = 20;(' + f + ')(); })');
}
wrap(sayx)();
這工作,因爲該函數將呼籲其toString函數將返回「原創'來源..因此,我們基本上創建了一個函數的包裝版本,它有一個覆蓋x的新範圍。結果將是一個打印'20'而不是'10'的警告框。
然而,表面上看起來可以工作,但範圍鏈被打破,鏈中的下一個項目不再是相同的,因爲函數'f'現在定義在不同的位置......更糟的是它繼承的範圍鏈可能包含調用函數不應該訪問的許多引用。
那麼,是否有一個更支持,可行的方式來注入一個範圍項目?是這樣的:
function withScope(f, scope) { ??? }
---
var x = 10, y = 10;
function dothemath() {
alert(x + y);
}
var haxthemath = withScope(dothemath, { x: 9000 });
haxthemath(); // 9010 not 20
我猜的答案是「不」,有些人可能會存在這樣的範圍內注射的「安全」問題,但考慮到你可以做的伎倆呢(儘管嚴重損壞)我不不認爲這是..
這樣做的好處是,你可以基本上僞造自己的僞變量。
在此先感謝。
編輯,只是澄清一點,想象我想「withScope」那有以下作用域鏈功能:
Window - window properties
Object - { var x = 10 }
Object - { var y = 5 + x }
我希望能夠得到一個功能回到那有效地具有相同的鏈+一個範圍我公司提供..即:
withScope(somefunc, { foo: 'bar' })
能給我
Window - window properties
Object - { var x = 10 }
Object - { var y = 5 + x }
Ext scope - { foo = 'bar' }
所有以前的常規變量都會被找到,因爲我的擴展範圍沒有提及任何關於它們的內容。
是的,這是關於封閉上下文與調用上下文。 – meandmycode 2009-11-27 23:31:38
謝謝Jani,我會回答你的回答「不」,我認爲沒有辦法,但我當然認爲這是值得扔在那裏,以防有任何有趣的'黑客'存在.. – meandmycode 2009-12-09 13:43:30