let 和 var 定义变量的区别

一、变量提升

var 存在变量提升,而 let 不存在变量提升,所以用 let 定义的变量一定要在声明后再使用,否则会报错。

var

//var定义的变量存在变量提升,变量会把声明提升到整个作用域的最前面
//例子1
console.log(a);  //undefined
var c=10;

//等价于
var c;
console.log(a);  //undefined
c=10;

/*------------------------*/
//例子2
var a=100;
function func(){
    console.log(a); //undefined
    var a=10;
    console.log(a); // 10
}
func(); //调用函数

//等价于
var a=100;
function func(){
    var a;
    console.log(a); //undefined
    a=10;
    console.log(a); // 10
}
func(); //调用函数

//注意:
//对于不声明而直接赋值的变量,相当于全局变量,赋值之后才可以使用,赋值之前会报错
console.log(a); //报错:a is not defined
a=100;
console.log(a); //100

let

//let定义的变量不存在变量声明,变量在声明前使用会报错
//例子1
console.log(a);  //报错 a is not defined
let a=100;

//例子2
function func(){
    console.log(a);
    let a=100;
}
func();//调用函数

二、作用域

var:只有全局作用域和函数作用域概念,没有块级作用域的概念。

let:只有块级作用域的概念 ,由 { } 包括起来,if语句和for语句里面的{ }也属于块级作用域。

var

//全局作用域例子
//也就是除了在函数内部定义的变量,其他都是全局变量。
for(var i=0;i<100;i++){
    ;
}
console.log(i); // 100

//函数作用域例子,如下 b会输出10 ,而a会报错“a is not defined”,为什么呢?
//因为对于不声明而直接赋值的变量(b),相当于全局变量。
//而对于在函数里声明赋值的变量(a),它只在函数内部有效,外部无法访问,否则会报错

function func(){
    b=10;
    var a=100;
}
func();//调用函数
console.log(b);  //  10
console.log(a);  //报错  a is not defined
/*补知识
    函数的语法:自调用函数,也就是会定义并调用该函数
    (function(){

    })();
*/
//考一考
(function(){
    var a=b=100;
})();
console.log(b);
console.log(a); 

//问题:a和b分别会输出什么呢?

//答案:b会输出100,而a会报错“a is not defined”

//为什么呢?

//首先,将该函数分解为我们所熟悉的写法
(function(){
    var a=100;
    b=100;
})();
console.log(b); //  100
console.log(a); // 报错 a is not defined;

//由此,可以看出了吧?这是前面所说的“函数的作用域”:b相当于全局变量,而a只作用于该函数内,外部访问不了。

let

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。在代码块中,使用let命令声明变量之前,该变量都是不可用的,这在语法上称为“暂时性死亡”

//例子1
//会报错“a is not defined”,因为在if代码块内,使用let声明变量之前,该变量都是不可用的,否则会报错
if(true){
    a=123;
    let a;
}

//例子2
//会报错“i is not defined”,因为用let定义的i只在for循环体内有效
for(let i=1;i<100;i++){
    ;
}
console.log(i)
 

三、重复声明

var:变量可以多次声明

let:变量不允许重复声明,let不允许在相同作用域内,重复声明同一个变量。不能在函数内部,重新声明同一个参数

var

var a=10;
function func(){
    console.log(a); // undefined
    var a=11;
    console.log(a); // 11
}
func();
console.log(a); // 10
var a;
console.log(a); // 10
var a =12;
console.log(a); // 12

//这个其实涉及到的是var的变量可重复声明和变量提升
//以上其实可以等价于
var a;
a=10;
function func(){
    var a;
    console.log(a); // undefined
    a=11;
    console.log(a); // 11
}
func();
console.log(a); // 10

console.log(a); // 10
a =12;
console.log(a); // 12

//这样,相信很容易得出正确的答案

let

//例子1
//会报错“Identifier ‘a‘ has already been declared”
var a=1;
let a=2;

//例子2
//不会报错,因为a可以在不同作用域内声明的。
let a=‘hello‘;
{
    let a=‘hi‘;
    console.log(a); // hi
}
console.log(a); // hello

//例子3
//会报错" Identifier ‘a‘ has already been declared",因为var定义的变量会发生变量提升。
let a=‘hello‘;
{
    var a=‘hi‘;
    console.log(a);
}
console.log(a);

//例子4
//会报错“Identifier ‘a‘ has already been declared”,
//不能在函数内部重复声明同一个参数,因为参数变量是默认声明的,所以不能用let或const再次声明
function func(a){
    let a=‘hello‘;
    console.log(a);
}
func(‘hi‘);

转载 https://blog.csdn.net/qq_41638795/article/details/81318704

原文地址:https://www.cnblogs.com/Tanghongchang/p/11007108.html

时间: 2024-11-02 20:43:08

let 和 var 定义变量的区别的相关文章

ts和js中let和var定义变量的区别

javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"JavaScript 严格模式",比如下述的代码运行就会报错: let hello = 'hello world.'; console.log(hello); 错误信息如下: let hello = 'hello world.'; ^^^ SyntaxError: Block-scoped declarations (let, const, function, class) not yet sup

js中let和var定义变量的区别

let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781671 声明后未赋值,表现相同 (function() { var varTest; let letTest; console.log(varTest); //输出undefined console.log(letTest); //输出undefined }()); 使用未声明的变量,表现不同: (function() { console

javascript中使用var定义变量的预编译效果

首先说明一点:javascript语法是非常灵活的,灵活的代价就是很容易导致不规范的编码和各种意想不到的运行结果.ECMAScript 5 引入了 严格模式 (strict mode),今后我们编写javascript代码最好都使用"use strict",规范我们的javascript代码.下面的测试代码不是基于严格模式. alert(a); var a;//已声明未赋值 alert(b);//未声明的变量 执行结果是:a打印undefined,b报错.这说明:var a;这条语句的

javascript中const、var、let定义变量的区别

转载自http://www.cnblogs.com/ksl666/p/5944718.html js中const,var,let区别 今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章.主要内容是:js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 3 console.log('函数外const定义b:' + b);//有输出值 4

var与this定义变量的区别以及疑惑

我们知道: var可以定义一个局部变量,当然如果var定义在最外层的话,就是全局的局部变量,也就算是全局变量了. 而this关键字定义的变量准确的说应该算是成员变量.即定义的是调用对象的成员变量. 另外在"类(构造函数)"中,我们通常也会用var定义私有属性,而this定义公共属性. 以上这些是大家都知道的,若不知道看了就大概知道的.但我今天遇到了一个疑惑,恳请社区高手指点.是这样的: //打开浏览器控制台执行一下命令 //定义了一个全局变量 var wahaha = "娃哈

ES6的let和var声明变量的区别

关于let的描述 let允许你声明一个作用域被限制在块级中的变量.语句或者表达式.与var关键字不同的是,它声明的变量只能是全局或者整个函数块的. 作用域规则 let声明的变量只在其声明的块或子块中可用,这一点,与var相似.二者之间最主要的区别在于var声明的变量的作用域是整个封闭函数,是全域的 . function varTest() { var x = 1; if (true) { var x = 2; // 同样的变量! console.log(x); // 2 } console.lo

mysql -- 存储过程中 declare 和 set 定义变量的区别

mysql存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 DECLARE 关键字声明的变量,只能在存储过程中使用,称为存储过程变量,例如:DECLARE var1  INT DEFAULT 0;  主要用在存储过程中,或者是给存储传参数中. 两者的区别是:在调用存储过程时,以DECLARE声明的变量都会被初始化为 NULL.而会话变量(即@开头的变量)则不

MySQL存储过程中declare和set定义变量的区别

在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅在类中生效.即只在存储过程中的begin和end之间生效. 2.@set定义的变量,叫做会话变量,也叫用户定义变量,在整个会话中都起作用(比如某个应用的一个连接过程中),即这个变量可以在被调用的存储过程或者代码之间共享数据.如何理解呢?可以看下面这个简单例子,很好理解. (1)先执行下面脚本,创建一

不使用var定义变量和使用var的区别

最基本的var关键字是上下文的,而不采用var是全局的这就不讨论了 “不管是使用var关键字(在全局上下文)还是不使用var关键字(在任何地方),都可以声明一个变量”.这貌似一个错误的概念:任何时候,变量只能通过使用var关键字才能声明. a = 10;是一个赋值语句,仅仅是给全局对象window创建了一个新属性(但它不是变量).“不是变量”并不是说它不能被改变,而是指它不符合ECMAScript规范中的变量概念,所以它“不是变量”. 1 alert(a); // undefined 2 ale