JavaScript(9):var、let、const

本文详细介绍了JavaScript中严格模式下var、let和const的特性,包括变量声明的严格性、作用域、可变性以及常量的不可更改。通过实例演示了如何避免常见错误并推荐使用let和const进行编程。
摘要由CSDN通过智能技术生成

  1、严格性
  ①、如果一个变量在未var声明之前使用,浏览器报告undefined。
  ②、如果一个变量在未let或者const声明之前使用,浏览器报告错误。

  一个变量在未做任何声明之前使用会报告错误,比如 

    console.log(i);

  浏览器会报告错误:Uncaught ReferenceError: i is not defined。
  如果在var声明之前使用是:

	console.log(i);
	var i;

  浏览器则会输出:undefined,不会报告错误。
  如果是在letconst声明之前使用:

	console.log(i);
	let i;

  或者

	console.log(i);
	const i=1;

  则会报告错误:Uncaught ReferenceError: Cannot access 'i' before initialization。
  


  2、声明
  ①、var声明的变量可以重复的,即使是在同一作用域。
  ②、let和const在同一作用域当中是不能重复声明的。

	var i=1;
	var i=2;
	let j=3;
	// let j=4;//报告错误
	const k=5;
	const k=6;//报告错误

 

  3、作用域
  ①、var声明的变量要么是全局的,要么就是函数级的,没有块级作用域之说。
  ②、let、const属于块级作用域,一对{}就是一个块。

  var的例子:

	var i=1;
	{
		var i=2;
		console.log('在块中输出i:'+i);
	}
	(function test(){
		var i=3;
		console.log('在函数中输出i:'+i);
	})();
	console.log('在全局中输出i:'+i);

  输出:

    在块中输出i:2
    在函数中输出i:3
    在全局中输出i:2

  let的例子:

	let j=1;
	{
		let j=2;
		console.log('在块中输出j:'+j);
	}
	(function test(){
		let j=3;
		console.log('在函数中输出j:'+j);
	})();	
	console.log('在全局中输出j:'+j);

  输出:

    在块中输出j:2
    在函数中输出j:3
    在全局中输出j:1

  const的例子:

	const k=1;
	{
		const k=2;
		console.log('在块中输出k:'+k);
	}
	(function test(){
		const k=3;
		console.log('在函数中输出k:'+k);
	})();	
	console.log('在全局中输出k:'+k);//在全局中输出

  输出:

    在块中输出k:2
    在函数中输出k:3
    在全局中输出k:1

  在《JavaScript(8):即时函数》中经典面试题中,有下面的代码

	for(var i=0;i<5;i++){
		setTimeout( function(){
			i=i+1;
			console.log(i);
		},5000);
	};
  console.log('i:'+i);

  实际输出为:

   如果要输出1、2、3、4、5,使用即时函数可以达到目的:

	for(var i=0;i<5;i++){
		(function(x){
			setTimeout( function(){
				x=x+1;
				console.log(x);
			},5000)			
		})(i);
	}
	console.log('i:'+i);

  但更简单的是使用let声明变量即可: 

	for(let i=0;i<5;i++){
		setTimeout( function(){
			i=i+1;
			console.log(i);
		},5000);
	};

  4、赋值
  ①、var、let声明的变量是可以改变的;
  ②、const声明的变量则不行。注意:如果将一个对象定义为const,那么这个对象就不能重新赋值(对象为引用类型),但是对象的属性和方法是可以改变的。

	const stu1={id:1,name:'小宋',math:89.0};
	console.log(stu1.math);
	stu1.math=97.5;
	console.log(stu1.math);
	stu1={name:'小王'};//报告错误

  输出:

 

  如果要完全锁定对象,可以使用Object.freeze方法。

	const stu1={id:1,name:'小宋',math:89.0};
	console.log(stu1);
	stu2=Object.freeze(stu1);
	stu1.math=97.5;
	stu1.name='小王';
	console.log(stu1);
	console.log(stu1===stu2);
	stu2.math=97.5;
	stu2.name='小王';	
	console.log(stu2);
	console.log(stu1===stu2);

  输出:

  5、结论:

  ①、尽量使用let和const,少用var;

  ②、尽可能地使用严格模式。

    'use strict';
    //......变量的定义与使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值