新定义的变量在函数中报告“未定义”而其余部分不是?

时间:2015-11-08 12:08:53

标签: javascript visual-studio visual-studio-2015 windows-phone

我遇到了一个问题,当我在某个函数中使用它们时,我的一些声明和定义的变量被报告为未声明的。 所以我一直在玩它,它似乎没有 - 每当我添加新变量时,它们在代码中定义后直接定义,然后在功能块内部确实报告未定义。

我一直在使用资源而不是发布它们,比如URL对象和数据库的连接,所以想知道是不是因为我内存不足?

所以我重启了手机 - 没有去。此外,在较新变量下定义的旧变量报告它们确实已定义?而新的变量仍然没有。

有关更多说明,以下是visual studio报告的内容: confusing variable error ^除了'newVar'和任何其他新定义的变量

之外,该块中的每个变量都能正常工作

(免责声明:我不是专业人士 - 只是一个业余爱好者,所显示的任何代码都不代表生产就绪代码,谢谢!)

示例问题代码:

(function() {
    "use strict";
    var variable1,
        variable3 = 10,
        variable2 = 100,

    function clickHandler() {
        console.log(variable1); //prints "undefined" in green text.
        console.log(variable2); //prints "100"
        console.log(variable3); //prints "'variable3' is undefined" in red text
    }
    clickHandler();
})();

使用最新的公共SDK开发Windows Phone 8.1应用程序,在Windows 10上以javascript编写,在Visual Studio 2015社区版中。

2 个答案:

答案 0 :(得分:3)

在参考我的评论时,我会将您的回复视为" no",建议的示例输出不是您实际运行该代码时所获得的 - 我&# 39;解释我为什么要问......

你所指的是词法范围,它是一个核心概念 - 你可以在函数闭包中可靠地访问外部变量,实际上你的例子运行没有问题 - 至少在V8引擎上,我'我现在无法在微软风格的环境中进行测试。

您可以从中做出的唯一值得注意的观察(除了错字)将使用函数作为语句而不是表达式。请参阅this post on the differences between the two - 我没有花费任何时间进行调查,但可以想象Javascript hoisting订单在不同的Javascript引擎中可能存在奇怪的行为差异。

这可能是一个红色的鲱鱼,因为你希望所有变量在这种情况下显示为undefined - 如果这是你的话,它很容易验证然而,通过简单地交换函数声明来解决问题:

function clickHandler(){        // ... swap this function statement
var clickHandler = function(){  // ... for this function expression

现在我怀疑实际上是问题。我无法在屏幕截图中看到onPinch功能,但从我看到的内容中没有提及newVar。控制台中的错误不是由您的代码产生的,而是由您尝试通过调试器将对变量的引用注入到解析后的执行上下文中。

当你的代码运行时,编译器不会只是将词法范围内的所有内容转储到本地上下文中 - 它将进行优化, 你不能在函数内部设置一个断点,并期望在实际代码中看到该函数没有使用的参数。

如果你想在控制台中使用该变量,可以在某处对其进行任意引用 - 例如,即使以下内容也会确保它在范围内:

function onPinch(ev){
    newVar; 
    //...
}

答案 1 :(得分:0)

在你的例子中,var行需要以a终止;

 var variable1,
    variable3 = 10,
    variable2 = 100;

variable1将是clickHandler函数中唯一未定义的变量。