博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(0,fn)()的执行原理
阅读量:6713 次
发布时间:2019-06-25

本文共 977 字,大约阅读时间需要 3 分钟。

今天在看babel插件的源码的时候,发现Babel的很多插件都是这样是写的。

var _default = (0, _helperPluginUtils().declare)((api, options) => {    })复制代码

咦,这个(0,_helperPluginUtils().declare)是什么意思呢? 怎么用呢? 本着求知的精神,在网上查了下。

问题

首先我们先来思考一个问题

const a = {    foo: function () {        console.log(this === window);    }};const  foo1 = a.foo;a.foo();foo1();(0, a.foo)();复制代码

给你三秒钟时间,思考下a.foo(),foo1()和(0,a.foo)() 分别会输出什么?

1

2

3

揭晓答案

a.foo(),foo1()和(0,a.foo)() 分别会输出false,true和true。

a.foo()我们都能理解,a对象去调用foo的方法,所以this指向a。

foo1() 因为下面的代码不在严格模式下,且 this 的值不是由该调用设置的,所以 this 的值默认指向全局对象。

逗号操作符

(0,a.foo)() 的this的为什么是window呢?这是因为逗号操作符的运行规则。

逗号操作符 对它的每个操作数求值(从左到右),并返回最后一个操作数的值。

这句话怎么理解呢?看下面的代码

console.log((1, 2));   // 返回最后一个操作数的值 => 2console.log((a = b = 3, c = 4));   // 返回最后一个操作数的值 => 4复制代码

所以 (0, a.foo)(), 其实等于

0;var temp = a.foo;temp();复制代码

因为逗号操作符的运行规则,对它的每个操作数求值(从左到右),并返回最后一个操作数的值。(0, a.foo)返回了_foo,然后_foo在全局环境里面调用,所以this指向window

为什么要这样做呢?

这样做是为了将a.foo的this设置为window(在严格模式下为undefined)

如果直接调用a.foo的话a.foo里面的this将指向a。

参考资料

转载地址:http://agslo.baihongyu.com/

你可能感兴趣的文章
杭电1865--1sting
查看>>
解决除法溢出的问题
查看>>
PhpExcel中文帮助手册|PhpExcel使用方法
查看>>
面试转载
查看>>
codeforces 961A Tetris
查看>>
Spring Cloud 微服务入门(一)--初识分布式及其发展历程
查看>>
62. Unique Paths && 63 Unique Paths II
查看>>
python 课程笔记
查看>>
第三个Sprint冲刺第九天(燃尽图)
查看>>
构造方法
查看>>
【LibreOJ】#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop 线段树+完全背包
查看>>
IntelliJ IDEA多模块Maven项目丢失rebel xml文件
查看>>
【网络流24题】魔术球问题
查看>>
Android动态设置Shape
查看>>
javascript 函数的节流(throttle)与防抖 (debounce)
查看>>
在selenium中使用css选择器进行元素定位
查看>>
体验分析(收藏)
查看>>
VoltDB培训PPT一则
查看>>
iview和element表格单元格渲染html
查看>>
安全研究人员:可绕过Gatekeeper安全机制macOS漏洞
查看>>