为什么}!{在JavaScript控制台中导致错误?

时间:2012-08-16 14:21:20

标签: javascript

如果您将}!{放入Chrome中的JavaScript控制台,那么您将获得false

为什么我们没有收到错误?

2 个答案:

答案 0 :(得分:14)

出现这种行为的原因是,Chrome会使用另一段代码将您输入的任何内容包装到控制台中。

它包装的代码(在撰写本文时)如下:

with ((window && window.console && window.console._commandLineAPI) || {}) {
    // Your code here.
}

输入}!{将关闭代码块括号,并在最后创建一个新的(否定的)对象。

正如您在控制台中看到的那样!{}会返回false


我经历了相当漫长的调查过程以找到答案,我的原始评论保留在下面

原始答案:

只是一个理论;我想在控制台中输入的代码在函数

中被调用

function execUserCode() { code }

您正在做的是创建

function execUserCode() { }!{ }

控制台正在返回最后一个结果,实际上是!{ } = false


修改

很多关于这可能是错误的评论。我同意。这只是一个理论。

我喜欢这些谜题,所以我对Chromium来源进行了深入研究,这对我来说有点多,但我会留下一些指示,以防其他人有刺伤。

JS控制台被称为“检查员”,可在此处找到:

chromium/src/third_party/WebKit/Source/WebCore/inspector/

我一直在关注inspector/front-end/ConsoleView.js,我想我发现了一些用户代码执行的地方。

evaluateUsingTextPrompt: function(expression, showResultOnly)
{
    this._appendCommand(expression, this.prompt.text, false, showResultOnly);
},

原因!

小脑波。我在控制台中这样做了

> myEval = eval
> eval = function(str) { console.log(str); myEval(str) }
> }!{

结果:

with ((window && window.console && window.console._commandLineAPI) || {}) {
}!{
}

我很亲密,但现在我们得到了答案:)

代码在当前第440行的chromium/src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js中生成。

答案 1 :(得分:3)

只是一个猜测。如果脚本包含在{}中并使用eval执行,则会发生这种情况。

用户脚本:"}!{"

附在{}"{}!{}"

然后eval("{}!{}")提供false

所以我猜这就是浏览器控制台中发生的事情。