为什么此代码中存在"未定义"?



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

在调用函数 Obj 值时,a 的值被打印为未定义

你的错误是:

1:不需要函数将消息登录控制台,可以直接调用,if会注销。 例:

Let a = 10 
console.log(a)

结果将是 10

2:当你初始化一个全局变量,同时初始化一个函数时,同时调用它们会抛出错误或多次渲染。 例:

Let a = 10;
function Obj() {
console.log(a)
let a = 10;
}
Obj() // this and the global will intend to run once, which will cause error.

最佳做法是将函数作为回调调用,以便在触发事件时记录 例:

btn.addEventListener("click", obj)

单击此按钮时,它将记录 10

Javascript 使用作用域链来建立给定函数的作用域。通常有一个全局作用域,定义的每个函数都有自己的嵌套作用域。在另一个函数中定义的任何函数都有一个链接到外部函数的本地作用域。定义范围的始终是源中的位置。

作用域链中的元素基本上是一个 Map,其中包含指向其父作用域的指针。

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

如果您这样编写示例,则运行:

console.log(this.a);

在声明 let 和 const 值之前访问它们可能会导致 ReferenceError ,因为存在时间盲区

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

所有代码一起为您提供:

未捕获的引用错误:未定义 a

由于作用域,在本地函数作用域中,a 稍后用 let 定义,它覆盖了函数之前的定义。

您可以尝试两种方法:

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

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

首先,您需要了解用let声明的变量具有块作用域。并且您不能在同一范围内再次声明相同的变量,这将给出错误。
因此,在您的情况下,您将在函数结束时声明a。所以还没有宣布。

而不是使用var来声明变量,它不会抛出这样的错误,但会返回undefined

为了更好地理解有关let的概念,您可以通过以下链接。

  1. 让变量
  2. 变量

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

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

因此,如果没有变量初始化变量,则值将未定义。

在您的情况下,代码在第一个控制台上中断。由于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

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

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

如果您不熟悉 JS :),请检查这一点https://www.w3schools.com/js/js_mistakes.asp

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

函数也是一个对象,对于它的属性,首先是a:undefined,你执行一个未定义的读取(阅读javascript中的提升!

最新更新