是否可以用JavaScript创建一个提供持久本地作用域的控制台?

是否可以用JavaScript创建一个提供持久本地作用域的控制台?,javascript,browser,Javascript,Browser,我想用JavaScript为web应用程序创建一个具有持久作用域的控制台(想想chrome的开发控制台)。因此,您可以说,设置一个变量,然后稍后在控制台中访问该变量。在JavaScript中有没有一种简单的方法可以做到这一点 示例会话: var x = SomeCustomFunction() >> "the result" x.slice(4) >> "result" 我知道这不是你想要的 您可以使用devtools.inspectedWindowAPI开发Googl

我想用JavaScript为web应用程序创建一个具有持久作用域的控制台(想想chrome的开发控制台)。因此,您可以说,设置一个变量,然后稍后在控制台中访问该变量。在JavaScript中有没有一种简单的方法可以做到这一点

示例会话:

var x = SomeCustomFunction()
>> "the result"
x.slice(4)
>> "result"

我知道这不是你想要的

您可以使用devtools.inspectedWindowAPI开发Google Chrome扩展

使用chrome.devtools.inspectedWindow API与已检查的窗口交互:获取已检查页面的选项卡ID、在已检查窗口的上下文中计算代码、重新加载页面或获取页面内的资源列表


您的作用域已绑定到页面。

您可以使用对
eval
的间接调用

直接调用将不起作用,因为它们将使用调用执行上下文,这可能会在创建变量和尝试访问变量之间发生变化

相反,对
eval
的间接调用将使用全局执行上下文,因此变量将保持不变

一些间接调用
eval
的方法是使用
var myEval=eval;myEval(…)
window.eval(…)

var input=document.getElementById('input'),
data=document.getElementById('data');
document.getElementById('form')。onsubmit=function(){
var代码=input.value,
结果=window.eval(代码);
data.appendChild(document.createElement('dt')).appendChild(document.createTextNode(code));
data.appendChild(document.createElement('dd')).appendChild(document.createTextNode(result));
返回false;
};

//创建对象
var obj={};
//定义属性“控制台”`
obj.console={};
//定义`obj.console`的`log`属性`
obj.console.log=函数(名称,参数){
//如果调用`obj.console.log`时没有`args`
//在'obj'处定义'name',返回'obj[name]`
//否则设置`obj[name]`,返回`obj[name]`
if(name!==undefined&&args===undefined&&obj[name])返回obj[name]
else obj.setProps(名称,参数);返回obj[name]
};
obj.setProps=函数setProps(名称,参数){
//如果`name`不是保留的`log`,请将`obj[name]`设置为`args`
//将`obj[name]`保留在`obj的本地范围内`
如果(!this[name]&&name!==“log”)this[name]=args;
}
函数SomeCustomFunction(){
返回“结果”
}
var x=SomeCustomFunction();
//做事
对象控制台日志(“x”,x);
log(obj.console.log(“x”));
log(obj.console.log(“x”).slice(4));
//设置“y”
log(obj.console.log(“y”,Math.random()*1000).toFixed(5));
console.log(obj.console.log(“y”));
//全局设置'obj'属性

//对于(obj中的prop)如果(prop!=“log”&&&!window[prop])window[prop]=obj[prop]
假设您使用的是基于
eval
的实现,您可以创建一个iframe来创建单独的执行上下文。然后,您可以使用其全局
eval
函数在独立的执行上下文中计算表达式。上下文将在求值之间保留状态

var iframe = document.createElement('iframe');

// We have to attach the iframe to the document to get a new execution context.
document.body.appendChild(iframe);

// Now the console implementation is simply the context's eval function.
var myConsole = iframe.contentWindow.eval;

myConsole('function SomeCustomFunction() { return "the result"; }');
myConsole('var x = SomeCustomFunction()'); // "the result"
myConsole('x.slice(4)'); // "result"

eval
不是与应用程序代码隔离的。因此,使用控制台可能会破坏它(破坏应用程序状态。)@RickHitchcock,因为对eval的间接调用与直接调用的行为不同。见@NoahFreitas True。我只想提供一种简单的方法,但可以通过在另一个窗口中运行代码来改进,也可以通过添加
try…catch
来捕获错误,添加漂亮的对象显示,@Oriol,所以将变量设置为
eval
就足以使其成为“间接”的?听起来像是对eval的“间接”调用在全局范围内执行它,是吗?@BT是的,直接调用
eval
将在
submit
事件侦听器的范围内创建变量(因此不会在对它的不同调用之间共享)。将
eval
存储在变量中或使用
窗口。eval
生成将在全局范围内运行的间接调用。