前端javascript高级程序设计(第四版)第三章节语言基础 第(21-26)页 2022/9/19

3.1ECMAScript很大程度上借鉴了C语言和其它类C语言,如java和Perl
3.1.1ECMAScript区分大小写:且关键字不能作为函数名,但是换成大写或者小写是可以使用的,因为区分大小写。
3.1.2标识符:用来标识的的名称叫标识符,比如变量的名字肯定是语义化的,用来告诉你这个变量干嘛用的,用来起个具有代表意义的标识。函数名属性名,函数参数名也是同样的道理;
字母下划线美元符号其中一个必须作为开头,标识符的字母可以是Unicode的字母,最好用英文,正经人谁用里面除了英文的甲骨文写代码。
一般标识符使用单词的首字母大写,也就是驼峰写法,MyCar这样的,虽然不是强制,但是ECMAScript的命名方式是这样的,所以这样不会看起来很另类。
3.1.3注释方式为C语言的//单行注释和/**/多行注释
3.1.4严格模式:ECMAScript5增加了严格模式,ECMAScript3的不规范写法在严格模式,会对不安全的活动抛出错误,使用方法在脚本开头加上"use stritic",要带引号,如果只是某个单独的函数需要严格模式也可以只在当前函数体的第一行写"use stritic",书本在使用严格模式会明确说用了严格模式的
3.1.5语句ECMAScript中写完代码,要用分号;结尾,如果不写,由解析器自动决定在哪里结束,不加可能会出现无法查出的错误。在意想不到的位置结束,因为压缩代码的时候会删除空格,可能导致和别的标识符混合导致语法错误。
{ 代码},这样的形式叫代码块;下面的代码就是代码块{代码},if如果是单条语句可以不加,但是一般都会加上{}包裹,避免出现语法错误

if(test){
	test=false;
	console.log(test)
}

3.2关键字保留字:不要使用它预留的单词,未来可能会用到。
3.3变量 :ECMAScript的变量是松散性的,如果是C语言一个变量只能存数字,或者是字符,而ECMAScript是都可以保存,可以保存任意值。const和let只能在ECMAScript6以及后面的版本才可以使用。
3.3.1var关键字:使用var 后面跟一个单词(最好是用语义化的单词,比如你需要造一个房子,就需要施工队var 来建造一个房间room),var room="Jack",变量room也可以保存别的变量,比如把别的变量room2保存进去也可以。
定义新的变量ECMAScript会实现变量初始化默认赋值undefined,因此可以可以同时定边变量的时候赋值你想赋值的值,这和别的语言会有差异。但是这样初始化变量直接赋值,比如声明的时候直接赋值字符串,并不会将它标识为字符串类型,只是一个简单的赋值,这样后面你还可以保存别的数据类型,但是不推荐。
1.var声明作用域:
如果在函数内使用var声明的变量,只会在这个函数内有用,在这个包含这个变量的函数结束之后就会销毁这个变量。但是如果在函数内没有使用var声明,它会在函数以外的地方也会存在。这样可不是一个好事,最好不要这么干。严格模式use stritic可不允许你这么干,他会给你一个错误ReferenceError(引用错误)。
如果你想懒得写var 又想同时声明多个变量可以

var message="hai",
found=false,
age=29;

2 var声明提升:
变量提升书中想说的是哪怕你的var声明在函数内的最后面,他会被提升到函数作用域的最前面,但是不会携带它的值上去,只会赋值最初的undefined,知道到达声明的地方才会赋值真正的值
3.3.2let声明与var的最大区别是var是函数作用域,let是块作用域,

 if (true) {
        var name = "Matt"
        console.log(name);//Matt
    }
    console.log(name);//Matt

为什么可以打印出来Matt,因为var是函数作用域,意思就是在函数内声明,可以被包裹在里面,函数结束就会销毁,而在非函数的代码块内使用是可以被当前区域访问到的,就像渔网(指function)可以兜住大的鱼(var),小脸盆(除function的其它条件)是兜不住它的,所以就被漏出去了。
再看let的特性:

if (true) {
        let age = 26
        console.log(age);//26
    }
    console.log(age);//Uncaught ReferenceError: age is not defined(未捕获的引用错误,age没有定义)

这说明什么,let声明的变量会被关起来,外面的读不到,它比var声明的更强大,防止在function之外声明的变量被其它语句意外的读取到,或者说是影响到其它的程序刚好也在使用这个变量,会意外的赋值。块作用域是函数作用域的子集,这话比较难理解,看我下面的代码

(function () {
        if (true) {
            var aaa = 999
            let age = 26
            console.log(age);//26
            console.log(aaa);//999
        }
        console.log(aaa);//999
        console.log(age);//Uncaught ReferenceError: age is not defined(未捕获的引用错误,age没有定义)
    })()

是不是函数里面有let,和var,用的let就是只是用来拦住let的变量,但是不会阻拦var声明的变量泄露出去,所以在函数第一层下面打印的时候var声明的aaa泄露出去了,但是let声明的age的变量被拦住了。所以说块作用域也是参照函数作用域的方式将它拦在规定的区域不让它泄露出去,所以就有了那句话,块作用域是函数作用域的子集,你也可以理解块作用域是参照函数作用域,将泄露的范围放大了不在局限于只是函数的这一层,let出现在哪个{ }代码块内,它就泄露不出去。如果没有{ }就相当于是当前作用域的全局范围。
其它小点:同一个let声明不能同一个作用域出现2次,在其它同等级的作用域,或者等级更高或者更低的作用域可以重复使用,只要不是当前代码块内一块声明。因为javascript会记录变量声明的标识符所在的块作用域的位置,所以不会报错

(function () {
        let age = 10 //最高级块作用域
	        if (true) {
	            var aaa = 999
	            let age = 29 //二级作用域
	            console.log(age);//29
	            console.log(aaa);//999
	            let age = 29 //报错,这一行代码不要抄,不然报错会阻塞后面的代码
	        }
	        console.log(aaa);//999
	
	
		        (function () {
		            if (true) {
		                var aaa = 990
		                let age = 27 //最深层作用域		                
		                console.log(age);//27
		                console.log(aaa);//990
		                 let age = 27 //报错,这一行代码不要抄,不然报错会阻塞后面的代码
		            }
		            console.log(aaa);//990
		        })()
		        
        console.log(age);//10
    })()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值