做网站首页文字排版技巧,网页界面设计作品,厦门做网站企业,广州做家教的网站一、创建变量的7种方式#xff1a; 1、var 2、function 创建变量#xff08;函数名是一个变量 3、let 4、const 创建常量 5、import 基于es6 的模块规范导出需要的信息 6、class 基于 es6 创建的类 7、Symbol 创建唯一值
二…一、创建变量的7种方式 1、var 2、function 创建变量函数名是一个变量 3、let 4、const 创建常量 5、import 基于es6 的模块规范导出需要的信息 6、class 基于 es6 创建的类 7、Symbol 创建唯一值
二、var与let有什么区别 1、let不允许在相同的作用域下重复声明而var允许 2、let会产生块级作用域var不会。 3、var有变量提升而let没有 4、let没有暂时性死区问题 5、let创建的全局变量没有给window设置对应的属性
变量提升机制
当浏览器开辟出供代码执行的栈内存后代码并没有自上而下立即执行而是继续做了一些事情把当前作用域中所有带var/function关键字的进行提前的声明和定义。 当执行 JS 代码时会生成执行环境 只要代码不是写在函数中的就是在 全局执行环境中 函数中的代码会产生 函数执行环境 只此两种执行环境。 b() // call b
console.log(a) // undefined
var a Hello world
function b() {console.log( call b)
} 以上输出是因为函数和变量提升的原因 。通常提升的解释是说将声明的代码移动到了顶部 这其实没有什么错误便于大 家理解 。但是更准确的解释应该是在生成执行环境时会有两个阶段 。第⼀个阶段是创建的阶段 JS 解释器会找出需要提升的变量和函数 并且给他们 提前在内存中开辟好空间 函数的话会将整个函数存⼊内存中 变量只声明并且赋值为 undefined 所以在第⼆个阶段也就是代码执行阶段 我们可以 直接提前使用。 在提升的过程中相同的函数会覆盖上⼀个函数 并且函数优先于变量提升 b( ) // call b second
function b() {console.log( call b fist)
}
function b() {console.log( call b second)
}
var b Hello world var 会产生很多错误所以在 ES6中引⼊了 let 。 let 不能在声明前使用但是这并不是常说的 let 不会提升 let 提升了在第⼀阶段内存也已经为他开辟好了空间但是只声明并未赋值初始化但是因为这个声明的特性导致了并不能在声明前使用。 关于变量提升的演示题
示例1下面代码能否实现点击某个按钮body的背景色改为按钮对应的颜色若不能如何改进
body
button classred红/button
button classgreen绿/button
button classblue蓝/button
/body
scriptvar body document.querySelector(body)var buttons document.querySelector(button)var arr [red,green,blue]for(var i 0; ibuttons.length;i){buttons[i].onclick function (){body.style.background arr[i]}}
/script
答案当然是不能因为通过var定义的变量在for循环中的i是全局的变量提升、3次循环过后i3因为点击每个都相当于点击最后一个要实现就需要将var变成let。
示例2
var a 1;
function test() {console.log(a);if(false) {var a 2;}
}
test();
Javascript分为预处理阶段和执行阶段尽管if里面的语句不会被执行但是在预处理阶段还是会将其提升因此最终还是undefined。 函数会先去找自己内部的变量内部有就不会往外面找内部没有才去外面找