Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Intellisense告诉了我关于嵌套函数中JavaScript变量作用域的什么?_Javascript_Scope - Fatal编程技术网

Intellisense告诉了我关于嵌套函数中JavaScript变量作用域的什么?

Intellisense告诉了我关于嵌套函数中JavaScript变量作用域的什么?,javascript,scope,Javascript,Scope,使用VS2013。Intellisense要么工作不正常,要么(更有可能)它告诉了我一些我无法理解的关于范围的深层次信息: function Outer() { var aaa = 1; function Inner() { a } } 当我在内部输入a时,Intellisence显示aaa,正如预期的那样 function Outer() { var aaa = 1; return; function Inner() {

使用VS2013。Intellisense要么工作不正常,要么(更有可能)它告诉了我一些我无法理解的关于范围的深层次信息:

function Outer() {
    var aaa = 1;
    function Inner() {
      a
    }
}
当我在内部输入a时,Intellisence显示aaa,正如预期的那样

function Outer() {
    var aaa = 1;
    return;
    function Inner() {
      a
    }
}
在这里,Intellisense不显示aaa。为什么?它是否已经决定,因为我没有打电话给内线,aaa将超出范围?这是一个严酷的决定,但它似乎就是这么做的,因为

function Outer() {
    var aaa = 1;
    Inner();
    return;
    function Inner() {
      a
    }
}
Intellisense将再次显示aaa。这是正确的行为吗

我是JS的新手。我来自C#,在C#中,范围在开发和运行时之间不会改变。我知道嵌套函数使作用域在运行时不可预测。Intellisense是想保护我不受伤害吗


谢谢

这是一个非常有趣的问题。如果没有使用过Intellisense for JavaScript,我就无法权威地回答;但我想我有一个猜测

我的理解来自于一位杰出的JavaScript开发人员,他最著名的是(如果我没有弄错的话,他是一些重要开发工具中使用的文本编辑器,包括Chrome的web inspector)

Haverbeke正在为JavaScript开发一个名为。在本文中,他承认VisualStudio的JS类型推断的惊人之处(下面的重点是我的):

从VS11开始,JavaScript的“智能感知”就是 太神了据我所知,通过实际运行 以一种神奇的不可见方式编码,检测脉轮引擎 忽略I/O并切断运行时间过长的循环或递归 太深,然后检查生成的JavaScript环境以 找出为给定变量或变量创建的实际类型 表情。这使得它惊人地准确,即使你正在做 你的类型很奇怪缺点是有时不会 能够用实际代码运行需要完成的代码 输入类型(它需要找到指向该代码的代码路径,该路径 可能很棘手),因此无法提供完整性。

我不知道他是否有在VisualStudio工作的朋友,但你所看到的似乎证实了这一点。如果Intellisense实际上是在一种隔离的环境中执行JS,那么这就解释了为什么在定义
内部
之前返回会阻止类型推断工作


换句话说,Intellisense实际上并没有对JavaScript进行静态分析(如果是的话,死代码路径不应该阻止它理解理论范围)。它实际上运行JavaScript来确定类型。因此(如果Haverbeke是对的),死代码路径就是死胡同。

请记住,所有本地函数定义都是“挂起的”JSLint会在“return”之后说:
不可访问的“function”。
函数声明被提升,因此代码不是不可访问的。Intellisense不会告诉您任何关于变量范围的深刻信息<代码>aaa在所有三种情况下都可以在
内部
中访问;这里缺少代码完整性是IDE的一个缺点。(并不是说我不满意;JS范围解析对于IDE来说是一个非常困难的问题,向他们致敬,因为在其他两种情况下正确地解决了这个问题。)我理解这是不可能实现的。这不是最终产品。我习惯于先编写函数,然后编写代码来调用它。您是否建议在VS中使用Intellisense,必须首先写入函数的至少一条路径,然后才写入函数体?那可不好!