浅谈(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对象合并的4种方式与数组合并的4种方式

    下面是对“js对象合并的4种方式与数组合并的4种方式”的详细讲解攻略: JS对象合并的4种方法 在JS中,有多种方法可以合并两个或多个对象,如下: 1. 手动遍历合并 这种方式是通过遍历对象中的属性并将其复制到另一个对象中来进行合并的,可以使用 for…in 循环或 Object.keys 方法获取要遍历的属性,示例如下: let obj1 = {a: …

    JavaScript 2023年5月27日
    00
  • Javascript里的两种使用正则的方法

    当我们需要在JavaScript中进行字符串匹配、替换或者提取操作时,常常需要用到正则表达式。在JavaScript中,我们可以使用两种不同的方法来使用正则表达式。 方法一:RegExp对象的方法 RegExp对象是JavaScript内置的正则表达式对象,我们可以使用它的方法来处理字符串。 1. 创建RegExp对象 我们可以使用RegExp对象的构造函数…

    JavaScript 2023年6月10日
    00
  • 详解JavaScript匿名函数和闭包

    详解JavaScript匿名函数和闭包 JavaScript匿名函数和闭包在程序员开发中经常用到,本文将对它们进行详细的介绍,并提供两个示例,以便读者更好地理解。 什么是匿名函数? 在JavaScript中,函数可以具有名称和匿名两种形式。没有名称的函数称为匿名函数。匿名函数不需要用函数名调用,可以通过函数变量调用。 匿名函数的语法如下: var x = f…

    JavaScript 2023年6月10日
    00
  • JavaScript中的稀疏数组与密集数组[译]

    JavaScript中的数组可以是密集的,也可以是稀疏的。密集数组即为连续的数组元素,稀疏数组表示有些元素被省略了。本文将详细讲解JavaScript中稀疏数组和密集数组的概念和行为。 什么是稀疏数组? 稀疏数组是指数组元素具有不连续性,或者说中间有空洞的数组。在稀疏数组中,一些元素是不存在的,我们可以用下标访问到的元素即表示存在的,没法访问到的元素则被视为…

    JavaScript 2023年5月27日
    00
  • js字符串处理之绝妙的代码

    下面我将详细讲解“js字符串处理之绝妙的代码”这个主题,帮助你了解这个主题的内容和示例。 什么是 JavaScript 字符串处理? JavaScript 是一种具有强大字符串处理能力的编程语言。字符串作为 JavaScript 中最常见的数据类型之一,经常需要被处理和操作。JavaScript 提供了一组内置的字符串方法,用于处理和操作字符串。 常见的字符…

    JavaScript 2023年5月28日
    00
  • 原生js实现旋转木马效果

    实现旋转木马效果,可以分为如下几个步骤: 初始布局 在HTML中创建一个容器元素,然后在其中添加多个子元素,这些子元素将组成我们的木马效果。为了充分体现木马效果,这些子元素需要位置排列形成一个环。 样式与动画 为容器元素以及子元素定义样式,使其在页面中呈现出我们想要的样式和动画效果。通过CSS3中的转换、动画控制元素的旋转、移动、透明度等效果。在这里,我们需…

    JavaScript 2023年6月11日
    00
  • 前端通过JavaScript创建修改CAD图形详情

    创建和修改CAD图形一般通过CAD软件进行,但是我们也可以通过前端JavaScript开发框架来创建和修改CAD图形,主要分为以下几个步骤: 了解CAD图形基础知识:CAD图形通常包含了几何图形、属性信息和坐标系信息。在JavaScript中,需要使用相关库或API来处理这些信息。 选择适合的库或API:在JavaScript中,有多种库和API可供选择来创…

    JavaScript 2023年6月10日
    00
  • webgl 系列 —— 着色器语言

    其他章节请看: webgl 系列 着色器语言 本篇开始学习着色器语言 —— GLSL全称是 Graphics Library Shader Language (图形库着色器语言) GLSL 是一门独立的语言,和其他语言一样有自己的变量、运算符、函数、循环(for)、控制语句(if)、函数、数组等等。 GLSL 比较简单。其专门用于编写着色器,舍弃了许多编程语…

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