64-未声明var

声明变量 b 的时候没有加 var,因此 js 引擎默认将变量 b 声明为全局变量(值为 undefined)并提升到作用域顶部

1
2
(function(){var a=b=5;})()
console.log(b) //5

在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。

1
2
3
"use strict";
(function(){var a=b=5;})()
console.log(b) // Uncaught ReferenceError: b is not defined

未使用 var 声明的全局变量的configurable 属性是 true,也就是说,未通过 var 声明的变量是可以删除的,如下:

1
2
3
4
5
6
7
8
var a = 1
b = 2

console.log(Object.getOwnPropertyDescriptor(window, a))
// { value: 1, writable: true, enumerable: true, configurable: false }

console.log(Object.getOwnPropertyDescriptor(window, b))
// { value: 2, writable: true, enumerable: true, configurable: true }
1
2
3
4
5
delete a
// false

delete b
// true