首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于var/const,为什么这段代码可以工作?

var和const是JavaScript中的变量声明关键字。

var关键字用于声明一个变量,并且可以被重新赋值。它的作用域是函数作用域或全局作用域,意味着在声明它的函数内部或全局范围内都可以访问到该变量。

const关键字用于声明一个常量,它的值在声明后不能被修改。const声明的变量必须在声明时进行初始化,并且不能再次赋值。它的作用域规则与let相同,是块级作用域。

下面是一个示例代码:

代码语言:javascript
复制
var x = 5;
const y = 10;

function example() {
  var x = 15;
  const y = 20;
  
  console.log(x); // 输出15
  console.log(y); // 输出20
}

example();

console.log(x); // 输出5
console.log(y); // 输出10

这段代码可以工作的原因是:

  1. 在全局作用域中,使用var关键字声明的变量x被赋值为5,使用const关键字声明的常量y被赋值为10。
  2. 在example函数内部,使用var关键字声明的变量x被重新赋值为15,使用const关键字声明的常量y被重新赋值为20。
  3. 在调用example函数后,通过console.log输出了函数内部的变量x和常量y的值,分别为15和20。
  4. 在全局作用域中,通过console.log输出了全局变量x和常量y的值,分别为5和10。

总结起来,这段代码可以工作是因为var和const关键字在不同的作用域中声明了不同的变量和常量,并且在相应的作用域内可以访问到它们的值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

编写高质量可维护的代码:一目了然的注释

前言 有一些人认为,好的代码是自我解释的。合适的命名和优秀的代码的确可以减轻开发人员阅读代码工作量,对于不是特别复杂的代码可能确实可以做到自我解释。...// BUG 此处有 Bug const arr = [] Tips: 为什么 // 注释可以在 .less 或 .scss 文件中使用,但是在 .html 和 .css 文件中不生效?...单行注释为什么有时候写在代码上方,有时候写在代码后方? 注释可以书写在代码中的任意位置。个人理解,一般写在代码上方的时候意为对后面一段代码的注释,而写在代码后方的时候意为对本行代码的注释。...,也就是说在这段代码中,“被注释”的那行代码生效了!...所以注释也不是随便写一写就可以的,要描述某段代码的功能,注明逻辑,让开发者可以”无脑“浏览。 之前在工作群中看到有人发过这样一张图(如下图),个人认为是一个很好的代码注释的范例: ?

1.1K20

最失败的 JavaScript 面试问题

可以在 MDN 上查看更多关于箭头函数的信息。 变量作用域 这个主题值得探讨,不仅因为它在面试中很受欢迎,而且还有实际应用的原因。如果你能很好地理解变量作用域,那么你将节省大量的调试代码的时间。...要轻松记住一种编程语言是如何工作的,了解为什么它是这样工作的会很有帮助(简单吧!)。 这种行为是因为 const 变量而被选中的。访问未定义的 var 变量时,我们得到的是undefined。...小测验3:只有36%的正确答案 以下示例不推荐在实际生活中使用,但你应该知道这段代码至少会如何工作,以满足面试官的兴趣。...如果你是面试官,并且由于某种原因你不喜欢候选人,那么模块绝对可以帮你让任何人都失败。 为了这篇文章的目的,我们选择了关于这个主题最简单的任务之一。但相信我们,ES6模块要复杂得多。...如果你明白这段代码是如何工作的,你几乎不应该在其他所有有关提升的问题上遇到任何问题。

17320
  • ES6语法:var、let、const的区别详解

    (str); 这段代码的结果是 "hello world",这说明在var 申明的变量,即使是同样的名字,在不同的块中,在外层块中的变量优先级更高,也就是说,在外层优先使用并且只能使用当前块中的变量...这里也可以访问到test } 可能你会感到奇怪,我的var 申明的变量在if 代码块里面,为什么我的else里面也能访问呢,其实上面这段代码相当于下面这段代码 function variableHoisting...这就是所谓的变量提升,我在if里面申明的变量,其实浏览器在预解析的时候就对var ,以及function关键字的变量或者方法进行了处理,处理后的代码就是上面这段代码(当然,我之前讲过一篇函数声明与函数表达式的区别...(object.name) 这段代码,第一个会打印出来“学习笔记”,第二个会打印出来“hello world”,为什么呢?...原因在这,其实,这段代码改变的不是object这个对象变量,而是这个变量的属性,知道了这个就不难理解为什么在for-in ,for-of循环里面,const不会报错了吧?

    41510

    【前端技能树-需要避免的坑】Javascript 开发者容易在花田里犯的错

    例如,下面这段代码: for (var i = 0; i < 10; i++) { /* ... */ } console.log(i); 如果你猜测 console.log() 是输出 undefined...例如下面这段代码: var theThing = null; var replaceThing = function () { var priorThing = theThing; var...但是这是为什么呢? 让我们重新更详细地检查这段代码一下,发现: 每个 theThing 对象都包含大小为 1MB 的 longStr 对象。...所以再次疑惑为什么这里会有内存泄漏。 为了理解发生了什么,我们需要更好地理解 JavaScript 的内部工作原理。闭包通常由链接到表示其词法范围的字典对象的每个函数对象实现。...在 for 循环中错误地使用函数定义 考虑这段代码: const elements = document.getElementsByTagName('input'); const n = elements.length

    19211

    bug诞生记——const_cast引发只读数据区域写违例

    所以像const这类体现设计者意图的关键字,可以隐性的透露给我们它描述的对象的使用边界。它是我们的朋友,我们要学会和它相处,而不是改变它。...目前这段代码可以正确执行,但是之后一个同学对Base类的优化,将彻底触发修改const属性引发的灾难。...为什么写这个地址会出错,我们看下get_name中aBase的地址 .rdata:0041DB30 aBase db 'Base',0 ; DATA XREF...关于什么信息会保存在只读区域,以及还有什么其他区域,大家可以在网上搜索PE/ELF文件格式的说明。        ...最后从语义角度来说,可以认为Derive的作者违背了编译器对关键字const的约束,即违背了一种约定导致的。所以我们尽量别用const_cast这种试图绕过编译器的“小聪明”手段。

    49410

    不可变和ES6中的const

    正文 ES6中的const创造的是一种不可变得binding(绑定),这不代表被const定义的变量是一个constant(常量)或是immutable(不可变的)。一个const变量是可以改变的。...下面的例子就为你们展示这一点,这段代码是完全合法的ES6代码,并且不会抛出异常: const foo = {};foo.bar = 42;console.log(foo.bar);// → 42 在这段代码里...补充一点:现在有个提议就是关于在未来的ECMAScript标准中增加一种完全不可变的数据结构。...基于上面我们所了解的,我认为使用const代码更易于阅读,一个const变量总是指向同一个object(译者:而且你可以改变对象内的值),let则完全不能保证这一点(译者:即无法保证总是指向同一object...let或者const,都不要在ES6代码里用var 不知道你同意吗?

    48230

    疑惑: Go const 导致程序结果错乱 ?

    这个场景是我自己随便想的, 如果过于夸张, 请原谅我. ^^ 下面我们用代码大概模拟下这个场景: func main() { var totalPrice uint32 = 500 const couponPrice...const 类型, 为什么程序能正常编译 500 - 550 的结果为什么不是 -50 重写再写一段新的代码, 我们把数值缩小一点, 方便后面的阐述 func main() { var totalPrice...这个我就不在展开了, 聪明的你可以试试下面的代码, 然后思考下为啥func main() { var totalPrice uint8 = 255 var couponPrice uint8 = 1...: ", totalPrice+couponPrice) } 这段代码你觉得结果是什么A....请自行执行下面这段代码的结果, 然后分析一下吧, 原因还是还是上面说的, 一定要注意类型的取值范围. func main() { var a int64 = 922372037 fmt.Println

    60320

    一文带你弄懂JavaScript中的变量提升

    先从一个简单的例子来入手: a = 2; var a; console.log(a); 以上的代码会输出什么,假如这段代码是从上到下执行的话,肯定会输出undefined,然而JavaScript...这段代码的输出结果是2,意外吗?那么,为什么会这样,这个关键点就在于--变量提升。他会将当前作用域的所有变量的声明,提升到程序的顶部,因此,上面的代码等价于以下代码,这样是不是就能明白一些了?...var a; a = 2; console.log(a); 那么我们再看一个例子: console.log(a); var a = 2; 这段代码又会输出什么?输出2吗?...其实这段代码会输出undefined。这又是为什么呢?...03 变量声明 js的变量声明应该大体上可以分三种:var声明、let与const声明和函数声明。函数声明与其他声明一起出现的时候,就可能会引起一些冲突。

    31640

    你不知道的this(1)

    identify.call(you); // Reader speak.call(me); // Hello, 我是 Kyle speak.call(me) // Hello, 我是 Reader 这段代码可以在不同的上下文对象...误解 我们介绍this到底如何工作之前,要解除一些关于this的错误认知。如果太拘泥于this字面的意思就会产生一些误解。...那么为什么需要从函数内部引用函数自身呢?常见的原因是递归(从函数内部调用这个函数)或者我们写一个在第一次被调用后自己可以接触绑定的事件处理器。...实际上,如果他深入探索的话,他就会发现这段代码在无意间创建了一个全局变量count,他的值为NaN。...此外,编写这段代码的开发者还试图使用this联通foo()和bar()的词法作用域,从而让bar()可以访问foo()作用域里的变量a。

    34710

    使用letconst定义变量的场景

    为什么使用Let,const定义变量更节省内存?...,才可以获取和使用该变量 04 为什么使用let,const声明变量可节省内存空间 如下面代码 function f(condition) { if(condition) { let...// 语法错误,常量未初始化 const name; 06 关于循环中const声明 在代码中,经常会用到for循环,需要初始化变量,对于for循环来说,可以在初始化时使用const,但要是更改这个变量的话...}) } 在这段代码中,变量i被声明为常量,在第一次循环中,i是0,迭代执行成功,然后执行i++,因为这条语句试图修改常量,因此抛出错误,如果后续循环不会修改该常量,那么可以使用const声明 比如...,可以使用var 总结 块级作用域绑定的let,const为javaScript引入了词法作用域,使用它们声明变量不会提升,而且只可以在声明这些变量的代码块种使用 使用let,const也能够节省内存空间

    1K20
    领券