翼度科技»论坛 编程开发 JavaScript 查看内容

浅谈(0,eval)('window')

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
浅谈(0,eval)('window')

最近研究qiankun 源码,在import-html-entry 包中看到这个,一脸懵,研究了一下,记录一下。参考了这篇博客
这个干啥用的
  1.         // 通过这种方式获取全局 window,因为 script 也是在全局作用域下运行的,所以我们通过 window.proxy 绑定时也必须确保绑定到全局 window 上
  2.         // 否则在嵌套场景下, window.proxy 设置的是内层应用的 window,而代码其实是在全局作用域运行的,会导致闭包里的 window.proxy 取的是最外层的微应用的 proxy
  3.         const globalWindow = (0, eval)('window');
  4.         globalWindow.proxy = proxy;
复制代码
如代码注释所示,这个是确保获取全局作用域的window
如何做到的


  • eval 直接调用与间接调用。es5规范中指明,间接调用eval是在全局作用域中执行。
  • 哪些是直接调用,哪些是间接调用。简单来说,计算出eval 值,来调用得就是间接调用,如果是引用就是直接调用。看例子

    • 直接调用

  1. eval('...')
  2. (eval)('...')
  3. (((eval)))('...')
  4. (function() { return eval('...') })()
  5. eval('eval("...")')
  6. (function(eval) { return eval('...'); })(eval)
  7. with({ eval: eval }) eval('...')
  8. with(window) eval('...')
复制代码

  • 间接调用
  1. (1, eval)('...')
  2. (eval, eval)('...')
  3. (1 ? eval : 0)('...')
  4. (__ = eval)('...')
  5. var e = eval; e('...')
  6. (function(e) { e('...') })(eval)
  7. (function(e) { return e })(eval)('...')
  8. (function() { arguments[0]('...') })(eval)
  9. this.eval('...')
  10. this['eval']('...')
  11. [eval][0]('...')
  12. eval.call(this, '...')
  13. eval('eval')('...')
复制代码

  • 为什么

    • , 运算符,会去最后一个运算数,然后取值
    • =,?: 也是如此
    • 总结来说这些运算符都有一个取值得操作
    • 然而(,)这两个操作符没有取值这个意味。


来源:https://www.cnblogs.com/kongshu-612/p/17375980.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具