यहां एक अतिरिक्त विचार है जो एस्सेलिया के प्रस्ताव के साथ काफी शक्तिशाली हो सकता है (चर्चा के लिए उनके उत्तर पर टिप्पणियां देखें)।
आप डमी आईफ्रेम बना सकते हैं और Function
फ़ंक्शन का उपयोग कर सकते हैं। इसके साथ बनाए गए फ़ंक्शन को डिफ़ॉल्ट रूप से आईफ्रेम के दायरे तक पहुंच होगी, हालांकि यह अभी भी इससे बाहर हो सकती है। सौभाग्य से इसे रोकने के लिए आसान है, जिस तरह से Esailija सुझाव दिया।
मैं समारोह की कल्पना इस तरह हो सकती है:
function sandboxed(code) {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var F = frame.contentWindow.Function,
args = Object.keys(frame.contentWindow).join();
document.body.removeChild(frame);
return F(args, code)();
}
DEMO
वैकल्पिक रूप से आप कोड को 'use strict';
पहले जोड़ें कर सकते हैं।
यह कम से कम क्रोम में काम करता है।
(function() {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var same = window === frame.contentWindow.Function('return window;')();
alert(same ? ':(' : ':)');
document.body.removeChild(frame);
}());
स्रोत
2012-08-08 17:40:21
ठीक है, आप 'window' और' document' पैरामीटर के रूप में निर्धारित कर सकते हैं, के लिए सीधी पहुँच को रोकने के लिए: इस तरह से बनाया समारोह आइफ्रेम के वैश्विक गुंजाइश या पृष्ठ की वैश्विक क्षेत्र पर पहुंच है या आसानी से परीक्षण किया जा सकता उन्हें (जैसा कि आपने पहले ही कहा है) और फिर ग्लोबल्स की अंतर्निहित परिभाषा को रोकने के लिए कोड को 'सख्त उपयोग' तैयार करें। यह काम कर सकता है। लेकिन निश्चित रूप से यह मौजूदा ग्लोबल्स तक पहुंच को रोकता नहीं है जब तक कि आप पैरामीटर के माध्यम से उन्हें "छाया" न करें। हो सकता है कि कोई भी सभी 'विंडो' गुणों पर पुन: सक्रिय हो और पैरामीटर सूची स्वचालित रूप से बना सके। –
@ फ़ेलिक्सक्लिंग चेहरे के मूल्य पर अच्छा लगता है, मैं कुछ हैक्स को देखने के लिए कोशिश कर रहा हूं कि क्या मैं अभी भी वैश्विक – Esailija
@ फ़ेलिक्सक्लिंग तक पहुंच प्राप्त कर सकता हूं, मेरा वर्तमान एक है, अगर आप 'फंक्शन' छाया कर सकते हैं तो काम कर सकते हैं http://jsfiddle.net/dFmyd/ – Esailija