第三章——语法基础

JavaScript的语法规则很大程度上借鉴了C语言和其他类C语言,如Java和Perl。熟悉这些开发语言的就很容易理解,JavaScript宽松的语法。

3.1 变量

3.1.1 var关键字

  • 在JavaScript(ECMAScript)中,使用关键字 变量名 = 初始值这种形式来定义并初始化一个变量。注意定义变量和变量初始化是两步!
var msg; // 定义一个变量msg 此时msg=undefined
msg = "hello" // 给msg赋值位字符串hello

var的作用域

“作用域”是指变量起作用的范围。按照范围可以分为“全局变量”以及“局部变量”

  • 全局变量
var a = 10; // 在函数外定义(可以没有初始值)的变量是全局变量

function fun(){
	a = a + 5; // 在函数内部可以访问到外部的变量
}

console.log(a); // a = 15 并且可以修改该变量的值
  • 局部变量
function fun (){
	var a = 10; // 在函数内部定义了一个变量
	console.log(a); // a = 10 在同一个作用域下可以访问 
}
fun();
console.log(a); // ERROR: a is not defined 
// 外部作用域不可以访问到内部作用域的变量;也可以这么说当函数执行结束之后函数内部定义的变量都会被清除

虽然可以通过省略var关键字定义全局变量,但是不推荐这么做。尤其是在局部作用域中定义了一个全局变量,这样一个是不好维护,另一个也会造成一定的困惑。在严格模式下不使用关键字定义变量,则会导致抛出ReferenceError

var的变量提升

var 关键字定义的变量有一个特殊的情况,js加载的时候会默认把var定义的变量提升到它所在作用域的最上面

function foo(){
	console.log(arg);
	var arg = 100;
}
foo(); // undefined

上面这段代码之所以不报错就是因为“var的变量提升”,使得等价于下面这段代码:

function foo(){
	var arg;
	console.log(arg);
	arg = 100;
}
foo();

3.1.2 let 声明

let跟var声明的作用差不多,但是有着一个非常重要的区别。

let声明的变量是“块级作用域”,而var声明的“函数作用域”

// var定义变量
function foo(){
	if(true){
		var name = 'neek';
		console.log(name); // neek
	}
	console.log(name); // neek
}
foo();

// let定义变量
function fun(){
	if(true){
		let name = "tom";
		console.log(name); // tom
	}
	console.log(name); // ReferenceError: name is not defined
}
fun();

let 不允许同一个块级作用域中出现重复声明

var a = "a";
var a = "b";

let b = "b";
let b = "c";// SyntaxError

暂时性死区

由于在用一个块级作用域中,let 定义的同名变量只能存在一个;并且由于let没有“变量提升”,因此就会出现暂时性死区

console.log(test01); // undefined
var test01 = "test01";

console.log(test02); // ReferenceError: test02 is not defined
let test02 = "test02";

浏览器解析js的使用当执行这个块级作用域的时候会注意到let后面的变量名,并且这个之前不可以存在同名变量,如果存在就会抛出“SyntaxError”的错误

// Uncaught SyntaxError: Identifier 'aa' has already been declared
var aa = "aa";
console.log(aa);
let aa = 10; 

为了我的小命和头发,就未完待续吧……
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值