我的typescript文件中也有以下代码(也是一个已编译的javascript文件): 这里是来自外部javascript文件的全局变量。
declare var s: any;
function setValue() {
if (s) {
s.value = 'authenticated';
}
}
但是当它执行时会抛出
错误:未捕获的ReferenceError:s未定义。
需要更改为if (typeof s !== 'undefined')
。但我记得if(s)
也应该有效。谁知道为什么?
如果我这样做:
function setValue() {
let s;
if (s) {
s.value = 'authenticated';
}
}
它工作正常。但是这里也是未定义的。
答案 0 :(得分:1)
为了回应更新的问题,您遇到了以下问题:“未定义”可能由于JavaScript中的两个原因而出现:
undefined
是一种JavaScript数据类型,其中包含一个值undefined
。
undefined
。undefined
。undefined
。undefined
(包括访问从未设置的数组元素)。undefined
分配给变量。以下示例都将a
设置为undefined,typeof a
将评估为“undefined”:
var a;
a = function() {}(); // function returning undefined;
let b;
a = b; // uninitialized variable b has value undefined
b = {};
a = b.noSuchProperty; // undefined returned for non existent property
a = undefined; // assign the undefined data type.
当typeof
运算符应用于尚未在代码范围内声明的变量hat时,也会返回字符串值“undefined”。 不表示变量的值和数据类型为undefined
。
// s has not been declared in scope
console.log( typeof s); // logs "undefined"
if(s) // throws a ReferenceError, s not in scope
// following code
正如您所发现的那样,两者之间存在很大差异。尝试访问“undefined”变量,因为它在执行代码的范围内不存在会引发运行时错误。
答案 1 :(得分:1)
declare
是一个TypeScript关键字,用于告诉编译器在它不知道的全局范围内有一个变量。相反,let
实际上定义了一个变量。
这对您来说意味着当您declare var s: any
时,您通知TypeScript其他地方s
存在,并且它将在运行时运行。但由于s
未在全球范围内的其他地方定义,因此它实际上无法正常工作。
let s
确实有效的原因是因为您实际上使用的是真正的JavaScript来说:"让JS知道我想稍后使用一个名为S的变量。它的值是undefined
,但这没关系,因为至少它存在。"当您运行代码时,您会发现if
语句无法执行,因为s
存在,但undefined
。