8

如果你把}!{你的 JavaScript 控制台放在 Chrome 中,结果你会得到false.

为什么我们不会得到错误?

4

2 回答 2

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) || {}) {
}!{
}

我很接近,但现在我们有了答案:)

该代码chromium/src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js目前在第 440 行左右生成。

于 2012-08-16T14:26:03.710 回答
3

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

用户脚本: "}!{"

enclosed in {}: "{}!{}"

then eval("{}!{}") gives false

So I guess this is what happens in browser console.

于 2012-08-16T14:42:03.980 回答