JavaScript变量、作用域与内存笔记易错点

JavaScript变量、作用域与内存笔记易错点

1.如果值是对象或 null ,那么typeof 返回 “object”

let n = null;
console.log(typeof n); // object

2.虽然执行上下文主要有全局上下文和函数上下文两种(eval()调用内部存在第三种上下文),但有其他方式来增强作用域链。某些语句会导致在作用域链前端临时添加一个上下文,这个上下文在代码执行后会被删除。

通常在两种情况下会出现这个现象,即代码执行到下面任意一种情况时:

	a)  try / catch 语句的 catch 块
	b)  with 语句

这两种情况下,都会在作用域链前端添加一个变量对象。对with 语句来说,会向作用域链前端添加指定的对象;对 catch 语句而言,则会创建一个新的变量对象,这个变量对象会包含要抛出的错误对象的声明。看下面的例子:

function buildUrl() {
	let qs = "?debug=true";
	with(location){
		let url = href + qs;  //href=location.herf
	}
	return url;
}

这里, with 语句将 location 对象作为上下文,因此location 会被添加到作用域链前端。 buildUrl() 函数中定义了一个变量 qs 。当 with 语句中的代码引用变量 href 时,实际上引用的是 location.href ,也就是自己变量对象的属性。在引用qs 时,引用的则是定义在 buildUrl() 中的那个变量,它定义在函数上下文的变量对象上。而在 with 语句中使用 var 声明的变量url 会成为函数上下文的一部分,可以作为函数的值被返回;但像这里使用 let 声明的变量 url ,因为被限制在块级作用域,所以在 with 块之外没有定义。

3.使用 var 的函数作用域声明

function add(num1, num2) {
	var sum = num1 + num2;
	return sum;
}
let result = add(10, 20); // 30
console.log(sum); // 报错:sum在这里不是有效变量

这里,函数 add() 定义了一个局部变量 sum ,保存加法操作的结果。这个值作为函数的值被返回,但变量 sum 在函数外部是访问不到的。如果省略上面例子中的关键字 var ,那么 sum在 add() 被调用之后就变成可以访问的了,如下所示:

function add(num1, num2) {
	sum = num1 + num2;
	return sum;
}
let result = add(10, 20); // 30
console.log(sum); // 30

这一次,变量 sum 被用加法操作的结果初始化时并没有使用var 声明。在调用 add() 之后, sum 被添加到了全局上下文,在函数退出之后依然存在,从而在后面可以访问到。

4.let 与 var 的另一个不同之处是在同一作用域内不能声明两次。重复的 var 声明会被忽略,而重复的 let 声明会抛出SyntaxError 。

5.使用 const 声明的变量必须同时初始化为某个值。一经声明,在其生命周期的任何时候都不能再重新赋予新值。

const a; // SyntaxError: 常量声明时没有初始化
const b = 3;
console.log(b); // 3
b = 4; // TypeError: 给常量赋值

const 声明只应用到顶级原语或者对象。换句话说,赋值为对象的 const 变量不能再被重新赋值为其他引用值,但对象的键则不受限制。

const o1 = {};
o1 = {}; // TypeError: 给常量赋值
const o2 = {};
o2.name = 'Jake';
console.log(o2.name); // 'Jake'

如果想让整个对象都不能修改,可以使用Object.freeze() ,这样再给属性赋值时虽然不会报错,但会静默失败:

const o3 = Object.freeze({});
o3.name = 'Jake';
console.log(o3.name); // undefined
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值