为什么在执行javascript时得到错误`s'

时间:2017-07-13 00:52:06

标签: javascript typescript

我的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';
      }
    }

它工作正常。但是这里也是未定义的。

2 个答案:

答案 0 :(得分:1)

为了回应更新的问题,您遇到了以下问题:“未定义”可能由于JavaScript中的两个原因而出现:

  1. 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.
    
  2. 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
    
  3. 正如您所发现的那样,两者之间存在很大差异。尝试访问“undefined”变量,因为它在执行代码的范围内不存在会引发运行时错误。

答案 1 :(得分:1)

declare是一个TypeScript关键字,用于告诉编译器在它不知道的全局范围内有一个变量。相反,let实际上定义了一个变量。

这对您来说意味着当您declare var s: any时,您通知TypeScript其他地方s存在,并且它将在运行时运行。但由于s未在全球范围内的其他地方定义,因此它实际上无法正常工作。

let s确实有效的原因是因为您实际上使用的是真正的JavaScript来说:"让JS知道我想稍后使用一个名为S的变量。它的值是undefined,但这没关系,因为至少它存在。"当您运行代码时,您会发现if语句无法执行,因为s存在,但undefined