如果你把}!{
你的 JavaScript 控制台放在 Chrome 中,结果你会得到false
.
为什么我们不会得到错误?
这种行为的原因是因为 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 行左右生成。
只是一个猜测。如果脚本包含在 中{}
并使用 执行eval
,则会发生这种情况。
用户脚本: "}!{"
enclosed in {}
: "{}!{}"
then eval("{}!{}")
gives false
So I guess this is what happens in browser console.