javascript sandbox 一个模块,用于防止引用 Window
javascript sandbox a module to prevent reference to Window
我试图创建一个沙盒模块,该模块可以获取一个对象并阻止该对象的代码引用窗口。
这是它在概念中的工作方式。
var sand = function(window) {
var module = {
say: function() {
console.log(window.location);
}
};
return module;
}
sand({}).say(); // window.location is undefine
如果对象是传入的,则这不起作用
var $sand = (function(){
return function(obj, context) {
return (function(obj, window) {
window.module = {};
// doesn't work even copy object
for (p in obj) {
window.module[p] = obj[p];
}
console.log(window.location); // undefine
return window.module;
}(obj, context));
};
}());
var module = {
say: function() {
console.log(window.location);
}
};
$sand(module, {}).say(); // still reference to window.location
如何使此模式工作?
只要函数范围内没有变量阴影window
,该函数就可以访问window
。即使你有一个名为 window
的变量,代码仍然可以通过简单地省略window.
来访问属性。
(function(window) {
console.log(window.location); //undefined
console.log(location); //this will still work
})({ });
换句话说,在浏览器环境中对 JavaScript 进行沙盒处理是不可能的。
在你的第一个例子中,窗口undefined
的唯一原因是因为你传入一个空对象并调用参数window
,所以它隐藏了真正的window
。
此外,您始终可以通过将 this
变量提升到闭包中来访问窗口对象,如下所示:
console.log ( ( function () { return this; } )() );
因此,即使您以某种方式设法阻止window
,再次将其取回也是微不足道的。
如果您在沙盒之外定义函数,则上下文将是当前上下文,否则您实际上无法这样做。
如果你真的想做一些沙盒,那么你应该使用 iframe 来实现这一点。看看 https://github.com/substack/vm-browserify 它是node的vm
模块的浏览器版本,你应该能够提取一些好的工作,并避免eval
对于你想做的事情来说不是真正干净的。
相关文章:
- window.onload适用于aspx页面,但不适用于普通html
- window.location.href =“#find” 适用于移动设备,但不适用于 PC.在本地站点上正常(表达式
- window.onload 不适用于计数器页面
- 使用window.location.htm和匹配的URL数组(一个用于桌面,一个用于移动)将桌面网站重定向到移动
- window.navigate仅适用于Internet Explorer
- .load()适用于window,而不是ID
- Reg-ex,用于解析window.location.pathname并返回个/s
- IE 9 Javascript Window Variable 为 null.适用于IE 8
- window.innerWidth 不适用于 Internet Explorer Windows Mobile
- 如何使用 window.open 创建一个不确定延迟的弹出窗口(用于社交身份验证),而弹出窗口阻止程序会阻止它
- Chrome iframe:window.open 不适用于 onload handler
- 是否有类似于“$(window).load();”的东西用于在新插入的 Ajax 内容完成加载后执行函数
- 从Chrome 47开始,设置window.location.hash不适用于后退按钮
- 用于 SMS 消息传递的 window.location.href - 平台兼容性
- 如何在 Firefox 中以编程方式将焦点应用于 iframe 中的父框架(解决方法为 window.focus())
- Jquery 事件,如 $(window).load 用于部分视图
- self.focus() 和 window.focus() 适用于 Safari,但不适用于 IE
- javascript:window.print() 不显示用于打印的条形码
- Firefox window.controllers已被弃用.请勿将其用于 UA 检测
- JavaScript eval() 失败与 window.external.notify(),适用于 window.al