为什么此代码中的“未定义”?

时间:2018-07-05 14:25:42

标签: javascript ecmascript-6 variable-declaration hoisting

var a = 10;

function Obj() {
  console.log(a);
  let a = 10;
}

Obj()

在调用函数中,a的Obj值显示为未定义

8 个答案:

答案 0 :(得分:1)

在您的情况下,代码在第一个控制台上中断。由于a的范围在函数内,因此您在打印之前尚未定义它。

我举了一些例子向您展示了不同的初始化方案。

const derp = 10

const blerg = (derp) => {
 console.log('Checking case1: ', derp)
 //Reason: Here derp is the prop passed to the function and passed undefined to it.
}

const blerg2 = (derp) => {
 console.log('Checking case2: ', derp)
 //Reason: Here derp is the prop passed to the function
}

const blerg3 = () => {
 console.log('Checking case3: ', derp)
 // Throws Error
 //Reason: Here derp scope is within the function and not defined so far.
let derp = 20
console.log('Checking case4: ', derp)
// This line won't print because already code broke on the above console.
}

blerg()
blerg2(derp) // Passing the derp initialised on line 1
blerg3() // Passing nothing to the function

答案 1 :(得分:0)

Javascript使用范围链为给定功能建立范围。通常有一个全局范围,并且定义的每个函数都有其自己的嵌套范围。在另一个函数中定义的任何函数都具有与外部函数链接的局部作用域。始终是源中定义范围的位置。

范围链中的元素基本上是一个Map,带有指向其父范围的指针。

解析变量时,javascript从最内部的范围开始并向外搜索。

如果您这样做的话,您的示例将运行:

console.log(this.a);

答案 2 :(得分:0)

由于时间死区,在声明之前访问let和const值可能会导致ReferenceError

答案 3 :(得分:0)

a不是未定义的。该函数返回undefined,因为您尚未指定应返回的内容。它实际上返回一个错误,但是如果要运行,您将看到未定义的内容。

代码共同为您提供:

未捕获的ReferenceError:未定义

由于作用域,在局部函数作用域中,后来用let定义了a,它覆盖了函数之前的定义。

您可以尝试两件事:

  • 如果尝试使用console.log(window.a),将获得正确的值(外部a,在函数范围之外定义的那个)。

  • 如果将let a = 10;移到功能块的开头,则将获得该值。

答案 4 :(得分:0)

当您调用Obj()函数时。 JavaScript引擎将像下面这样阅读-

function Obj() { 
    let a;  //variable hoisting

    console.log(a); 

    a = 10;     
}

因此,如果没有变量初始化变量,则值将是不确定的。

答案 5 :(得分:0)

首先,您需要了解用let声明的变量具有块范围。而且您不能在同一范围内再次声明相同的变量,这会产生错误。
因此,在您的情况下,您需要在函数末尾声明a。因此尚未声明。

与其使用var声明变量,它不会引发此类错误,而是返回undefined

要更好地了解有关let的概念,请访问以下链接。

  1. let variable
  2. var variable

答案 6 :(得分:-1)

没有任何返回值的函数,默认情况下返回undefined

您的Obj函数将运行并输出控制台日志,但是它将返回未定义的内容。意思是“未定义函数的返回值”。

如果您不熟悉JS,请检查此内容:) https://www.w3schools.com/js/js_mistakes.asp

答案 7 :(得分:-3)

./module.ngfactory

函数也是一个对象及其属性,首先是a:undefined,您将执行未定义的读取(有关在javascript中吊起的信息!)。