用字面量调用原型方法为什么会报错,在加括号之后this对象变成了global?

作者站长头像
站长
· 阅读数 5

在思考原型对象中的this时发现,使用字面量直接调用会报错,但是使用变量调用就不会如:

Array.prototype.hello=function(){
    console.log('hello',this);
}
let p=[1,3];
p.hello();//输出hello,[1,3]
[1,3].hello();//报错

想到可能是没加括号的问题,给字面量加上括号后:

Array.prototype.hello=function(){
    console.log('hello',this);
}
([1,3]).hello();//输出全局global变量和报错

并且其中的this==global上面的执行环境是node今天试着在html文件中用<script>标签引入用字面量调用原型方法为什么会报错,在加括号之后this对象变成了global?用字面量调用原型方法为什么会报错,在加括号之后this对象变成了global?加了括号后this指向window,为什么加了括号之后的this会指向全局变量,而且为什么在控制台可以正常执行,在别的环境下会报错?

回复
1个回答
avatar
test
2024-07-07
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Example</title>
  </head>
  <body>
    <script>

        Array.prototype.hello=function(){
          console.log('hello',this);
        };

        [1,3].hello()
      
      
    </script>
  </body>
</html>

不看我的解释,你能发现你我代码的不同之处吗?

分号在 javascript 中是可选的,但是某些情况,你最好加上,不加的话你写的代码相当于:

Array.prototype.hello= function() { ... }[1,3].hello();//它会被认为一条语句

至于你在node下会出错,我合理怀疑你 [1,3].hello()前一条语句最后也少了分号,(虽然你贴出来的代码里是有的,我试了一下并不会报错)

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容