怎么理解这段js 代码

新手上路,请多包涵

`function foo() {

    getName = 222

    return this;
}


 foo().getName 

 console.log(getName)

`

为什么 getname 会成为全局变量

阅读 1.6k
4 个回答

历史遗留问题,在以前,一个变量没有经过声明就是用,会自动把这个变量声明为全局变量。

现在是不推荐这么写了,现在有严格模式,在严格模式下会出错

对一个变量赋值,顺着作用域链一直往上找,找到最近一个变量对其赋值,那么当没有声明变量时,非严格模式下一直往上查询到全局作用域,然后仍没有找到,就在全局作用域中赋值该变量,即等价于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语言的糟粕部分,理解一下就可以了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题