浅谈(0,eval)(‘window’)

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

最近研究qiankun 源码,在import-html-entry 包中看到这个,一脸懵,研究了一下,记录一下。参考了这篇博客

这个干啥用的

	// 通过这种方式获取全局 window,因为 script 也是在全局作用域下运行的,所以我们通过 window.proxy 绑定时也必须确保绑定到全局 window 上
	// 否则在嵌套场景下, window.proxy 设置的是内层应用的 window,而代码其实是在全局作用域运行的,会导致闭包里的 window.proxy 取的是最外层的微应用的 proxy
	const globalWindow = (0, eval)('window');
	globalWindow.proxy = proxy;

如代码注释所示,这个是确保获取全局作用域的window

如何做到的

  • eval 直接调用与间接调用。es5规范中指明,间接调用eval是在全局作用域中执行。
  • 哪些是直接调用,哪些是间接调用。简单来说,计算出eval 值,来调用得就是间接调用,如果是引用就是直接调用。看例子
    • 直接调用
eval('...')
(eval)('...')
(((eval)))('...')
(function() { return eval('...') })()
eval('eval("...")')
(function(eval) { return eval('...'); })(eval)
with({ eval: eval }) eval('...')
with(window) eval('...')
  • 间接调用
(1, eval)('...')
(eval, eval)('...')
(1 ? eval : 0)('...')
(__ = eval)('...')
var e = eval; e('...')
(function(e) { e('...') })(eval)
(function(e) { return e })(eval)('...')
(function() { arguments[0]('...') })(eval)
this.eval('...')
this['eval']('...')
[eval][0]('...')
eval.call(this, '...')
eval('eval')('...')
  • 为什么
    • , 运算符,会去最后一个运算数,然后取值
    • =,?: 也是如此
    • 总结来说这些运算符都有一个取值得操作
    • 然而(,)这两个操作符没有取值这个意味。

原文链接:https://www.cnblogs.com/kongshu-612/p/17375980.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈(0,eval)(‘window’) - Python技术站

(0)
上一篇 2023年5月5日
下一篇 2023年5月6日

相关文章

  • JS面试之对事件循环的理解

    JS面试之对事件循环的理解 事件循环是 JavaScript 事件模型的核心,对于理解 JavaScript 的异步编程至关重要。事实上,事件循环是 JavaScript 成功的关键之一。 什么是事件循环? JavaScript 是一种单线程编程语言。它有且只有一个主线程,因此只能同时执行一个任务。 事件循环是 JavaScript 异步编程的解决方案之一,…

    JavaScript 2023年5月28日
    00
  • JavaScript 七大技巧(一)

    JavaScript 七大技巧(一)攻略 JavaScript 是一门强大而灵活的编程语言,在编写高质量的代码时,使用一些技巧可以提高代码的可读性、可维护性和性能。下面是 JavaScript 中的七大技巧,本篇攻略将详细讲解其中的一些。 1. 使用严格模式 使用严格模式可以在编码时抛出更多的错误,这有助于提高代码的质量和可读性。而且,使用严格模式能够避免一…

    JavaScript 2023年5月17日
    00
  • JS跨域总结

    JS跨域总结攻略 什么是跨域 在浏览器中,一个Web页面从一个服务器的域名、端口或协议请求资源时,如果该请求目标与该Web页面的域名、端口或协议不一致,就会发生跨域。 JS跨域的原因 跨域问题的出现是因为浏览器的同源策略。同源策略是浏览器对JavaScript代码的安全限制,同源是指协议,域名,端口号均相同。浏览器阻止页面中的JavaScript程序去访问不…

    JavaScript 2023年6月11日
    00
  • 使用AutoJs实现微信抢红包的代码

    AutoJs是一款安卓平台上的自动化脚本编写工具,它不仅支持自动化操作手机应用,还支持使用JavaScript进行脚本编写。本文将详细讲解如何使用AutoJs来实现微信抢红包的代码。 第一步:准备工作 下载AutoJs APP,并安装到手机上。 打开AutoJs,在主界面点击左下角的“+”号按钮,创建一个新项目,并将其命名为“微信抢红包”。 在新项目的界面中…

    JavaScript 2023年6月11日
    00
  • Javascript中replace()小结

    当我们在Javascript中需要进行字符串的替换操作时,可以使用字符串内置的replace()方法。replace()方法接受两个参数,第一个参数是要替换的字符串或正则表达式,第二个参数是用于替换的新字符串。 下面是replace()的基本语法: string.replace(searchvalue, newvalue) 其中: searchvalue:要…

    JavaScript 2023年5月28日
    00
  • 大幅提升前端工作效率!Numeral.js数值格式化库来了!

    我们日常开发中,时常会碰到数值格式化操作的场景,今天了不起就为大家分享一款相对比较全面的数值格式化的JS库:Numeral.js Numeral.js Numeral.js 是一个用来对数值进行操作和格式化的 JS 库。可将数字格式化为货币、百分比、时间,甚至是序数词的缩写(比如1st,100th)。 安装 下载到本地引入 <script src=”n…

    JavaScript 2023年5月10日
    00
  • Java两个变量的互换(不借助第3个变量)具体实现方法

    Java两个变量的互换(不借助第三个变量)是一个常见面试题,面试者需要实现一种方法,使得交换两个变量的值而不借助第三个变量。本文将详细讲解一些实现方法及其代码示例。 方法一:使用加法与减法实现 通过加法和减法实现两个变量的互换的方法如下。 a = a + b; b = a – b; a = a – b; 其中a和b是要交换的两个变量。首先将a和b相加得到a …

    JavaScript 2023年6月10日
    00
  • Javascript Date getUTCMilliseconds() 方法

    JavaScript 中的 getUTCMilliseconds() 方法用于获取 UTC 时间的毫秒部分。在本教程中,我们将详细介绍 getUTCMilliseconds() 方法的使用方法。 getUTCMilliseconds() 方法的基本语法如下: date.getUTCMilliseconds() 其中,date 是获取毫秒部分的 UTC 日期对…

    JavaScript 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部