IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 读书笔记-javascript基础-varletconst区别 -> 正文阅读

[JavaScript知识库]读书笔记-javascript基础-varletconst区别

前言

记录自己阅读《javascript高级程序设计》的读书笔记。

  1. var声明的变量可以被提升到函数作用域顶部,let声明的变量无法提升,函数提升只会提升函数声明,而不会提升函数表达式。(注意,变量提升指的是声明被提升赋值等操作未被提升

var声明:

	function foo() { 
	console.log(age); 
	var age = 26;
	}
	foo(); // undefined 
之所以不会报错,是因为 ECMAScript 运行时把它看成等价于如下代码:
	function foo() { 
	var age;
	console.log(age); age = 26;
	}
	foo(); // undefined

let声明

	if (true) {
	let age = 26; 
	console.log(age); // 26
	} 
	console.log(age); // ReferenceError: age 没有定义

  1. var作用范围是函数作用域,let作用范围是块状作用域
  2. 在函数体内使用var 声明变量,会成为局部变量,该变量在函数退出时被销毁。
	function test() {
	var message = "hi"; // 局部变量 } test();
	console.log(message); // 出错!

  1. 在函数体中去掉var操作符,声明变量会成为全局变量。(注意 虽然可以通过省略 var 操作符定义全局变量,但不推荐这么做。在局部作用域中定义的全局变量很难维护,也会造成困惑)
	function test() {
	message = "hi"; // 全局变量
	}
	 test();
	console.log(message); // hi

  1. var可以重复声明变量,let不可以重复声明变量
	function foo() { 
	var age = 16; 
	var age = 26; 
	var age = 36; 
	console.log(age);
	} 
	foo(); // 36

	var name; 
	var name;
	let age;
	let age; // SyntaxError;标识符 age 已经声明过了

  1. const:
    const也不允许重复声明
    const 声明的限制只适用于它指向的变量的引用。换句话说,如果 const 变量引用的是一个对象,
    那么修改这个对象内部的属性并不违反 const 的限制。
	const person = {}; 
	person.name = 'Matt'; // ok
  1. let在全局作用域中声明的变量不会成为windows对象属性,var则会
	var name = 'Matt';
	console.log(window.name); // 'Matt' let age = 26;
	console.log(window.age); // undefined
  1. for循环中的let声明与var声明
	for (var i = 0; i < 5; ++i) {
	 setTimeout(() => console.log(i), 0)
	}
	// 你可能以为会输出 0、1、2、3、4 
	// 实际上会输出 5、5、5、5、5
	

	for (let i = 0; i < 5; ++i) { 
	setTimeout(() => console.log(i), 0)
	}
	// 会输出 0、1、2、3、4

原因:
1.使用var声明时,所有的迭代变量保存的都是退出循环的值,所以是5,而使用let声明,js引擎后台会为每个迭代循环声明一个新的迭代变量。每个 setTimeout 引用的都是不同的变量实例,所以 console.log 输出的是我们期望的值,也就是循 环执行过程中每个迭代变量的值。
2.setTimeout()属于异步程序,在js事件循环机制中,所有的同步程序都在执行栈中顺序执行。如果异步程序有返回结果,便将异步程序放到任务队列中。当所有的同步程序执行完成后,便将异步程序依次放入执行栈中执行。这也就是为什么var声明输出的结果会是退出循环的值,因为同步程序已经结束,i=5退出循环。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:05:05  更:2021-08-03 11:06:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 4:30:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码