`function foo() {
getName = 222
return this;
}
foo().getName
console.log(getName)
`
为什么 getname 会成为全局变量
`function foo() {
getName = 222
return this;
}
foo().getName
console.log(getName)
`
为什么 getname 会成为全局变量
对一个变量赋值,顺着作用域链一直往上找,找到最近一个变量对其赋值,那么当没有声明变量时,非严格模式下一直往上查询到全局作用域,然后仍没有找到,就在全局作用域中赋值该变量,即等价于window.getName = 222;
这个得分两步看:
首先,getName
没有使用 var/let/const
等声明关键字,getName
就会自动挂载到window
上成为window
的一个属性,可以通过 delete window.getName
来删除,与全局声明的var
变量还有所区别<var 定义的不能被delete>。
接着:getName
被赋值到 window
后,foo
函数又返回了 this
,而 this
指向调用者,foo
方法的调用者是 window
,所以返回的是 window
,然后取属性 .getName
自然就是前一步执行完后挂载到 window
上的 getName
啦。
这些都是js语言的糟粕部分,理解一下就可以了。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
历史遗留问题,在以前,一个变量没有经过声明就是用,会自动把这个变量声明为全局变量。
现在是不推荐这么写了,现在有严格模式,在严格模式下会出错