总结自:https://blog.csdn.net/DurianPudding/article/details/87953939 一言以蔽之:编辑器会在作用域判断这是重名声明时,忽略var直接赋值 首先说明JS代码运行时三者的作用: 引擎负责整个代码的编译以及运行 编译器则负责词法分析.语法分析.代码生成等工作 作用域负责维护所有的标识符(变量). 例: var a = 2; var a = 3; a = 4; alert(a); 重复声明时:首先,编译器对代码进行分析拆解,当遇见var a,则…
腾讯的一个笔试题,先看一下 var a = 100; function fn() { alert(a); //undefined var a = 200; alert(a); //200 } fn(); alert(a); //100 var a; alert(a); //100 var a = 300; alert(a); //300 前两个很简单,不解释 了,涉及到声明提前的问题. 后面仨为啥呢,这要总结下重复声明的问题: 1.使用var语句多次声明一个变量不仅是合法的,而且也不会造成任何错…
JS的容错率很高,一些其他语言常见的小错误JS都能大度得包容,比如给一个方法传入超出预计的参数.在声明变量之前使用该变量(变量的声明提升解决了这个问题)等等,这里我们就要解剖一下JS变量重复声明以及当我们忽略var使用 a=2来声明变量时a为全局变量的问题: //第一段代码 var a = 2; var a = 3; alert(a);//3 //第二段代码 <span style="font-size:18px;"></span><pre name=&q…
使用var 定义变量还会提升变量声明,即使用var定义:function hh(){ console.log(a); var a = 'hello world';}hh() //undefined 不使用var定义:function hh(){ console.log(a); a = 'hello world';}hh() // 'a is not defined' 这就是使用var定义的变量的声明提前.…
先来两个问题 很多时候,在直觉上,我们都会认为JS代码在执行时都是自上而下一行一行执行的,但是实际上,有一种情况会导致这个假设是错误的. a = 2; var a; console.log(a); 按照传统眼光,console.log(a)输出的应该是undefined,因为var a在a = 2之后.但是,输出的是2. 再看第二段代码: console.log(a); var a = 2; 有人会想到第一段代码,然后回答undefined.还有人会认为a在使用前未被声明,因此抛出Referen…
let命令有四大主要特性:存在块级作用域,没有变量提升,暂时性死区,不允许重复声明. 这都是和es5的var变量特性相反的. 1.存在块级作用域 let命令声明的变量只在其块级作用域中有效,就是{}中. { let a = 10; var b = 1; } console.log(a); //出错 not defined console.log(b); es5中要实现块级作用域,通常借助立即执行匿名函数来实现: (function(){ var a = 1; }()); console.log(…
var的作用就不多说了,下面说说var的缺点: 1.var可以重复声明 var a = 1; var a = 5; console.log(a); //5 不会报错 在像这些这些严谨的语言来说,一般是不允许重复声明的. 2.无法限制修改 var a = 5; a = 6; console.log(a); //6 不会报错 3.没有块级作用域 if(true){ var a = 5; } console.log(a) // 5 以上几个就是我个人对var的看法 ES6中,多了两个声明let 和 c…
变量是指程序中一个已经命名的存储单元,它的主要作用就是为数据操作提供存放信息的容器.变量是相对常量而言的.常量是一个不会改变的固定值,而变量的值可能会随着程序的执行而改变.变量有两个基本特征,即变量名和变量值.为了便于理解,可以把变量看作是一个贴着标签的盒子,标签上的名字就是这个变量的名字(即变量名),而盒子里面的东西就相当于变量的值. 1.变量的声明 在JavaScript中,使用变量前需要先声明变量,所有的JavaScript变量都由关键字var声明,语法格式如下: var variable…
var与let与const都是用来声明变量,但是三者之间也有一些区别 var的使用 var a;//声明变量a var a,b,c;//声明三个变量a,b,c var a,b,c=2;//声明了三个变量只有c的值为2, console.log(a,b,c)//undefined undefined 2 var 可以重复声明(不建议) var 可以同时声明多个变量,也可以同时赋值 var a=1; !function () { console.log(a)//1 }() 函…
在JavaScript中,定义变量的关键词一般用var,但还有一种定义变量的关键词叫let.两者的作用域范围不一样,我们可以将var理解为定义的是一个全局变量,而let定义的是一个局部变量.故let常用于函数体中,使得变量的作用域仅限于函数体内.下面通过一小段代码展示他们的作用范围. a(); function a() { let a = 'dd'; var b = 10; alert(b); } alert(a); // 报错,b is not defined alert(b);//成功打印1…
JavaScript var, let, const difference All In One js var, let, const 区别 All In One 是否存在 hoisting var 存在 hoisting; let, const 不存在 hoisting; let, const 存在 TDZ 暂时死区,在定义之前,不可以访问 const log = console.log; log(`i =`, i); // Uncaught ReferenceError: i is not…
js var & let & const All In One js var & let & const 区别对比 var let const 区别 是否存在 hoisting / 变量提升 var 存在 hoisting; let, const 不存在 hoisting; 作用域范围 var 是全局 scope 或函数 scope; let, const 是 block scope / 块级作用域; 能否重复声明 var 可以重复声明; let, const 不可以重复声…
Learn-JavaScript-with-MDN 系列文章: 01. var & let & const 对比 var & let & const 区别 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let…
一.var 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量 注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象 var a = 10; console.log(window.a) // 10 使用var声明的变量存在变量提升的情况 console.log(a) // undefined var a = 20 在编译阶段,编译器会将其变成以下执行 var a console.log(a) a = 20 使用var,我…
var是JavaScript刚出现时就存在的变量声明关键字,而let作为ES6才出现的变量声明关键字,无疑两者之间存在着很大的区别.那么具体有哪些区别呢? 1.作用域表现形式不同,var是函数作用域,let是块级作用域 { var monkey='熏悟空'; let pig='猪扒盖'; } console.log(monkey); //输出undefined console.log(pig); //报错:pig is not deined 由上面代码可见,let声明的变量只在其所在的代码块有效…