为什么}!{在JavaScript控制台中是否导致False?
如果你把为什么}!{在JavaScript控制台中是否导致False?,javascript,Javascript,如果你把}!{在Chrome中的JavaScript控制台中,结果会得到false 为什么我们没有得到一个错误?这种行为的原因是因为Chrome用另一段代码将您输入控制台的任何内容包装起来 它包装的代码(在编写本文时)如下所示: with ((window && window.console && window.console._commandLineAPI) || {}) { // Your code here. } 正在输入}!{关闭代码块大括号,并
}!{
在Chrome中的JavaScript控制台中,结果会得到false
为什么我们没有得到一个错误?这种行为的原因是因为Chrome用另一段代码将您输入控制台的任何内容包装起来 它包装的代码(在编写本文时)如下所示:
with ((window && window.console && window.console._commandLineAPI) || {}) {
// Your code here.
}
正在输入}!{
关闭代码块大括号,并在末尾创建一个新的(否定的)对象
正如您在控制台中看到的那样,!{}
返回false
我经过了相当长的调查过程才找到了答案,我的原始评论保留在下面 原始答案: 只是一个理论;我想象输入控制台的代码在函数中被调用
函数execUserCode(){code}
你所做的就是创造
函数execUserCode(){}!{}
控制台正在返回最后一个结果,实际上是!{}
=false
编辑: 很多关于这可能是错误的评论。我同意。这只是一个理论 我喜欢这种拼图,所以我对铬的来源进行了挖掘,这对我来说有点太多了,但我会留下一些提示,以防其他人有刺伤 JS控制台称为“检查器”,可在以下位置找到:
chromium/src/第三方/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\u party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js中生成的,目前大约在第440行。只是一个猜测。如果脚本包含在{}
中,并使用eval
执行,就会发生这种情况
用户脚本:“}!{”
包含在{}
中:“{}!{}”
然后eval(“{}!{}”)
给出false
所以我猜这就是浏览器控制台中发生的情况。Hmm,Chrome/V8错误或JavaScript语言的细微差别?可能是任何一种方式!}!!{
给出true
和};{
给出了未定义的
在IE9开发工具中,控制台给出了的“语法错误”!{
,}!!{
和};{
Firefox中的语法错误,似乎也是Chrome中的一个错误,它的语法无效。可能重复?我不认为是这种情况…返回'test';
在控制台中创建了语法错误。我不认为他们会使用字符串连接来构建函数,他们会使用函数
构造函数。很好是的,但是为什么这么多人投票并没有任何证据就接受了这个假设呢?如果这个假设是正确的,那么做}(“test”);{
应该返回未定义的
然后,因为最后一个表达式是{}
@kapep我同意你的观点,我很失望它被接受了,我希望自己能看到更多(更好)的理论。我刚刚花了15分钟爬铬源代码,我的眼睛很痛:(是的,console.log(arguments)
给出了ReferenceError。可能就像你说的,但它是一个简单的块而不是一个函数。@kapep更新了,现在得到了一个真实的答案。};console.log(“TEST”);{
outputsTEST
这将支持你的猜测!@Diode,非常接近。我设法找到了真正的原因,答案就在最后。