前言
JavaScript作为一门非常强大而又灵活的语言吸引了众多开发者,更有某大佬表示一切能用JavaScript实现的方案,最终都将使用JavaScript ,灵活多变造就了它的多样性,但是也带来了很多让开发者无可奈何,我们为了适应语言其中的怪点我们有时候会在此上面浪费很多时间,本文是本人分享一些非常奇怪的例子,如果面试被问到,那我想说兄弟你真的不怨
1.顶层变量的属性与全局变量相关
顶层对象在浏览器环境中指的是window对象,(其他环境咋不讨论),《ES6标准入门》作者阮一峰在书中提到 顶层对象的属性与全局变量相关,被认为是JavaScript语言中最大的败笔之一
1.1window初始化的name
console.log(name) // ?
var name = '黑猫警长'
可能一部分人认为按照变量提升理解直接秒答输出undefined 不过请大家看看初始化window的值
嘻嘻不好意思初始化值为空哦,请不要踩坑哦
1.2 window中的编排与可写性
name = 'dada'
let changValue1 = '黑猫警长一号'
var changValue2 = window
console.log(changValue2.name) // ''
console.log(changValue2) // window
changValue2 = '黑猫警长二号'
console.log(window.changValue1) // undefined
console.log(window) // window
console.log(window.changValue2) // 黑猫警长二号
window = '我想改大哥的值'
window = null
console.log(window) // 大哥不让我改
alert = window.console.log
alert(22) // 黑猫警长求关注 (不是弹出是打印)
window.window==window // true
console.log(window.window.window) // ..... window
- 从ES6开始全局变量将逐步与顶层对象属性隔离,使用let声明的全局变量将不再window上挂载
- 可以通过变量间接引用且使用window,但是无法通过变量改变window本身,也不可将window销毁
- window中存在window属性,为循环引用
- window不可改,但内部内置的方法可以改 (不完全对)
1.3 window的另外一个名字self
self.fan = '我是黑猫警长的粉丝'
console.log(fan) //‘我是黑猫警长的粉丝’
console.log(window.fan) //‘我是黑猫警长的粉丝’
console.log(self === window) // true
console.log(window.self) // window
console.log(self)
var self ='adad'
console.log(self)
通过代码可以看出self对象实际就是window对象,其中的要点与windowd大致相同,但是window本身不可写,而self却可写,希望下次遇见留个心眼别又踩坑
总结:
JavaScript语言的世界虽然非常精彩,但是却也存在着不少的问题,随着ECMA的规范不断更新,我们应该期待语言会随着时间而不断完善,对于这其中的瑕疵,我先列举这些,作为一个web的忠实爱好者,编程不只是一种技术更是一门艺术,我们应该去探索其中的奥妙,(哎呀编不下去了,溜了)