首页 > 其他分享 >js变量声明

js变量声明

时间:2024-01-09 22:01:01浏览次数:34  
标签:console 变量 作用域 js let var 声明 name

var 声明会被拿到函数或全局作用域的顶部,位于作用域中所有代码之前。这个现象叫作“提升” 3 (hoisting)。提升让同一作用域中的代码不必考虑变量是否已经声明就可以直接使用。

在实践中,提升也会导致合法却奇怪的现象,即在变量声明之前使用变量。下面的例子展示了在全局作用域中两段等 价的代码

// 等价于: 5
var name = "Jake";
 name = 'Jake';
var name;
下面是两个等价的函数:
function fn1() {
  var name = 'Jake';
}
// 等价于: function fn2() {
var name;
   name = 'Jake'; }

通过在声明之前打印变量,可以验证变量会被提升。声明的提升意味着会输出 undefined 而不是 Reference Error:

console.log(name); // undefined
    var name = 'Jake';
 function() { 10 console.log(name); // undefined
var name = 'Jake';
}

1. 使用 let 的块级作用域声明

ES6 新增的 let 关键字跟 var 很相似,但它的作用域是块级的,这也是 JavaScript 中的新概念。块 级作用域由最近的一对包含花括号{}界定。换句话说,if 块、while 块、function 块,甚至连单独 的块也是 let 声明变量的作用域。

if (true) {
  let a;
 console.log(a); // ReferenceError: a 没有定义
while (true) {
  let b;
}
console.log(b); // ReferenceError: b 没有定义
    function foo() {
      let c;
}
console.log(c); // ReferenceError: c 没有定义
// 这没什么可奇怪的
// var 声明也会导致报错
// 这不是对象字面量,而是一个独立的块
// JavaScript 解释器会根据其中内容识别出它来 {
let d; }
console.log(d); // ReferenceError: d 没有定义

let 与 var 的另一个不同之处是在同一作用域内不能声明两次。重复的 var 声明会被忽略,而重 复的 let 声明会抛出 SyntaxError。

var a; var a;
// 不会报错
{
let b;
let b; }
// SyntaxError: 标识符 b 已经声明过了
let 的行为非常适合在循环中声明迭代变量。使用 var 声明的迭代变量会泄漏到循环外部,这种情 况应该避免。
for (var i = 0; i < 10; ++i) {}
    console.log(i); // 10
for (let j = 0; j < 10; ++j) {} console.log(j); // ReferenceError: j 没有定义

严格来讲,let 在 JavaScript 运行时中也会被提升,但由于“暂时性死区”(temporal dead zone)的 缘故,实际上不能在声明之前使用 let 变量。因此,从写 JavaScript 代码的角度说,let 的提升跟 var 是不一样的。

标签:console,变量,作用域,js,let,var,声明,name
From: https://blog.51cto.com/u_16298172/9166604

相关文章

  • nextjs 一键部署ChatGPT 网页版
    ChatGPT的语境理解能力已经得到了大幅提升。它能够更好地理解你输入的问题或指令,并从中获取更多的上下文信息,以便给出更准确和相关的回答。无论是一般性的问题还是特定领域的知识,ChatGPT都能为你提供更有深度的答案Vercel官方打造的ChatGPT网页版代码特色Next.jsAppRouterReact......
  • 探讨JS混淆技术及其加密解密实例
    引言在当前计算机科学领域中,保护软件代码的安全性和隐私性变得愈发重要。为了防止黑客攻1击和恶意软件分析,开发人员采用各种技术来混淆和加密其代码,其中包括JS混淆技术。本文将介绍JS混淆技术的原理和应用,并提供一些相关的加密解密实例。一、JS混淆技术简介JS混淆技术是一种通过......
  • Three.js——十五、Box3、相机动画、lookAt()视线方向、管道漫游案例、OrbitControls
    正投影相机正投影相机和透视相机的区别如果都以高处俯视去看整个场景,正投影相机就类似于2d的可视化的效果,透视相机就类似于人眼观察效果调整left,right,top,bottom范围大小如果你想整体预览全部立方体,就需要调整相机的渲染范围,比如设置上下左右的范围。使用场景:正投影可以......
  • shell基础(变量)
    shell基础1、认识shellShell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。shell是一种解释型语言,这种语言经过编写后不经过任何编译就......
  • 记一次JSF异步调用引起的接口可用率降低
    前言本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程,主要介绍了排查思路和JSF异步调用的流程,希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF1,7.5-HOTFIX-T6版本。起因问题背景1.广告投放系统是典型的I/O密集型(I/......
  • mysql8.0全局变量持久化
    在MySQL数据库中,全局变量可以通过SETGLOBAL语句来设置。例如,设置服务器语句超时的限制,可以通过设置系统变量max_execution_time来实现:SETGLOBALMAX_EXECUTION_TIME=2000;使用SETGLOBAL语句设置的变量值只会临时生效,数据库重启后,服务器又会从MySQL配置文件中读取变量的默认值......
  • JS加密/解密之常见的JS代码加密
    JS混淆加密是一种将JS代码转换为更难理解和阅读的格式的技术,目的是为了保护JS代码的版权和安全,防止被恶意修改或盗用。JS混淆加密通常包括以下几种方法:变量重命名:将变量名替换为随机的字母或符号,使得代码的逻辑难以跟踪。字符串加密:将字符串转换为十六进制或Unicode编码,或者使用自......
  • Mac每次都要执行source ~/.bash_profile配置的环境变量才生效
    ~/.bash_profile中配置环境变量,每次重启终端后配置不生效.需要重新执行:$source~/.bash_profile解决办法zsh加载的是~/.zshrc文件,而‘.zshrc’文件中并没有定义任务环境变量。在~/.zshrc文件最后,增加一行:source~/.bash_profile如果这篇文章对你有用,可以关注本人微......
  • 如何在 Python 中安装 json 模块
    Python是一种功能强大的编程语言,自带了许多标准库,其中json模块是用于处理JSON数据的模块。在Python中安装json模块非常简单,因为它是标准库的一部分,不需要额外的安装步骤。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,并且易于机器解析和生成。Python的......
  • 第二节变量、注释、数据类型​
    变量变量命名规范:只能是数字、字母、下划线。只能以字母、下划线开头。不能是python关键字、内置函数名。建议:见名知意使用小写字母、下划线、数字组成。多词组成的变量名用下划线分割,不使用驼峰命名法。除循环计数或在极小的范围内外,不使用单个字母。例子1:x=12_y='abc'12xx=......