使用VS2013。 Intellisense无法正常工作或者(更有可能)它告诉我一些关于范围的东西让我感到不安:
function Outer() {
var aaa = 1;
function Inner() {
a
}
}
当我在内部输入a时,Intellisence会按预期显示aaa。
function Outer() {
var aaa = 1;
return;
function Inner() {
a
}
}
这里,Intellisense没有显示aaa。为什么?是否已经决定,因为我没有打电话给Inner,aaa会超出范围?这是一个苛刻的决定,但似乎正是因为
而正在做的事情function Outer() {
var aaa = 1;
Inner();
return;
function Inner() {
a
}
}
Intellisense将再次显示aaa。这是正确的行为吗?
我是JS的新手。我来自C#,其中范围在开发和运行时之间不会改变。我知道嵌套函数使得范围在运行时不可预测。 Intellisense试图保护我吗?
由于
答案 0 :(得分:2)
这是一个非常有趣的问题。如果没有使用Intellisense for JavaScript,我无法以权威回答;但我想我猜了。
我的理解实际上来自Marijn Haverbeke,这是一位杰出的JavaScript开发人员,最着名的是CodeMirror(这是一些重要开发工具中使用的文本编辑器,如果我没有弄错的话,包括Chrome的网络检查员)
Haverbeke正在开发一种名为Tern的JavaScript类型推理引擎。在a blog post about Tern中,他承认Visual Studio的JS类型推断非常棒(以下重点是我的):
从VS 11开始,JavaScript的“Intellisense”就是其中之一 惊人。据我所知,它可以通过实际运行你的 以神奇的隐形方式编写代码,检测Chakra引擎 忽略I / O并切断运行时间过长的循环或递归 太深了,然后检查生成的JavaScript环境 找出为给定变量创建的实际类型或 表达。这使得它非常准确,即使你正在做 与你的类型非常奇怪的事情。 缺点是它有时不会 能够运行您需要完成的代码与其实际 输入类型(它需要找到导致该代码的代码路径,其中 可能很棘手),因此无法提供完成。
我不知道他是否有朋友在Visual Studio上工作或者是什么,但这似乎可以通过你所看到的来证实。如果Intellisense实际上是在某种隔离环境中执行JS,那么这就解释了为什么在定义Inner
之前返回会阻止类型推断工作。
换句话说,Intellisense实际上并没有对您的JavaScript进行静态分析(如果是这样,死代码路径不应该阻止它理解理论范围)。它实际上运行 JavaScript来确定类型。所以(如果Haverbeke是对的)死代码路径是死路一条。