什么是Intellisense告诉我嵌套函数中的JavaScript var scope?

时间:2014-01-03 17:55:43

标签: javascript scope

使用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试图保护我吗?

由于

1 个答案:

答案 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是对的)死代码路径是死路一条。