在函数中新定义的变量报告 "undefined" 而其余的不是?
Newly defined variable reporting "undefined" in functions while the rest are not?
我遇到了一个问题,当需要在函数中使用它们时,我的一些已声明和定义的变量被报告为未声明。
所以我一直在玩弄它,似乎没有——每当我添加新变量时,它们在代码中定义后立即被定义,然后在功能块中它们确实报告未定义。
我一直在使用资源而不是释放它们,例如 URL 对象和数据库连接,所以想知道是否是因为我 运行 内存不足?
所以我重新启动了 phone - 不行。此外,在新变量下定义的旧变量报告它们确实已定义?而新变量仍然没有。
如需进一步说明,请参阅 visual studio 的报告:
^除了 '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();
})();
使用最新的 public SDK 开发 Windows Phone 8.1 应用程序,在 Windows 10 年 javascript 中编写 Visual Studio 2015社区版。
在您的示例中,var 行需要以 ; 结尾。
var variable1,
variable3 = 10,
variable2 = 100;
variable1 将成为 clickHandler 函数中唯一未定义的变量。
关于我的评论,我会将您的回复视为 "no",建议的示例输出不是您实际 运行 该代码所得到的 - 我会解释为什么我问...
你指的是词法作用域,它是一个核心概念——你可以在函数闭包中可靠地访问外部变量,而且你的示例运行确实没有问题——至少在 V8 引擎上,我不在现在可以在 Microsoft 风格的环境中进行测试。
您可以从中得出的唯一值得注意的观察结果(除了拼写错误外)是将函数用作语句而不是表达式。请参阅 this post on the differences between the two - I've not spent any length of time investigating but it's conceivable that Javascript hoisting 订单在不同 Javascript 引擎之间可能存在古怪的行为差异。
这可能是个误会,因为在这种情况下您会期望 所有 变量显示为 undefined
- 很容易验证这是否是您的问题然而,通过简单地换出函数声明:
function clickHandler(){ // ... swap this function statement
var clickHandler = function(){ // ... for this function expression
现在我怀疑实际上是问题。我在你的屏幕截图上看不到完整的 onPinch
函数,但据我所知,其中没有对 newVar
的引用。控制台中的错误不是由您的代码产生的,而是由您尝试通过调试器将对变量的引用注入到执行上下文中后解决的。
当您的代码是 运行 时,编译器不会将词法范围内的所有内容转储到本地上下文中 - 它会进行优化,,即 您不能在函数内部设置断点并期望在实际代码中看到函数未使用的参数。
如果您想在控制台中使用该变量,请在某处任意引用它 - 例如,即使是以下内容也能确保它在范围内:
function onPinch(ev){
newVar;
//...
}
我遇到了一个问题,当需要在函数中使用它们时,我的一些已声明和定义的变量被报告为未声明。 所以我一直在玩弄它,似乎没有——每当我添加新变量时,它们在代码中定义后立即被定义,然后在功能块中它们确实报告未定义。
我一直在使用资源而不是释放它们,例如 URL 对象和数据库连接,所以想知道是否是因为我 运行 内存不足?
所以我重新启动了 phone - 不行。此外,在新变量下定义的旧变量报告它们确实已定义?而新变量仍然没有。
如需进一步说明,请参阅 visual studio 的报告:
(免责声明:我不是专业人士 - 只是业余爱好者,显示的任何代码都不代表生产就绪代码,谢谢!)
示例问题代码:
(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();
})();
使用最新的 public SDK 开发 Windows Phone 8.1 应用程序,在 Windows 10 年 javascript 中编写 Visual Studio 2015社区版。
在您的示例中,var 行需要以 ; 结尾。
var variable1,
variable3 = 10,
variable2 = 100;
variable1 将成为 clickHandler 函数中唯一未定义的变量。
关于我的评论,我会将您的回复视为 "no",建议的示例输出不是您实际 运行 该代码所得到的 - 我会解释为什么我问...
你指的是词法作用域,它是一个核心概念——你可以在函数闭包中可靠地访问外部变量,而且你的示例运行确实没有问题——至少在 V8 引擎上,我不在现在可以在 Microsoft 风格的环境中进行测试。
您可以从中得出的唯一值得注意的观察结果(除了拼写错误外)是将函数用作语句而不是表达式。请参阅 this post on the differences between the two - I've not spent any length of time investigating but it's conceivable that Javascript hoisting 订单在不同 Javascript 引擎之间可能存在古怪的行为差异。
这可能是个误会,因为在这种情况下您会期望 所有 变量显示为 undefined
- 很容易验证这是否是您的问题然而,通过简单地换出函数声明:
function clickHandler(){ // ... swap this function statement
var clickHandler = function(){ // ... for this function expression
现在我怀疑实际上是问题。我在你的屏幕截图上看不到完整的 onPinch
函数,但据我所知,其中没有对 newVar
的引用。控制台中的错误不是由您的代码产生的,而是由您尝试通过调试器将对变量的引用注入到执行上下文中后解决的。
当您的代码是 运行 时,编译器不会将词法范围内的所有内容转储到本地上下文中 - 它会进行优化,,即 您不能在函数内部设置断点并期望在实际代码中看到函数未使用的参数。
如果您想在控制台中使用该变量,请在某处任意引用它 - 例如,即使是以下内容也能确保它在范围内:
function onPinch(ev){
newVar;
//...
}