(0,eval)('this')在插件中的作用

阅读前需要了解:? ?

????ES5严格模式:‘use strict’

? ? eval的间接引用和直接引用

? ? 逗号运算符的作用

????现在网上已经有很多的插件,他们不仅外观漂亮而且性能也好,插件再多也架不住产品的想法多,但是在开发过程中很多时候我们需要针对自己的项目,对一些常用的功能进行封装,这样大大提高了代码复用率。

? ? 封装过程中会有这么一步,是把自己的函数暴露给当前作用于或者全局。

????一般推荐暴露给当前作用域,也就是this的指向。

;(function(){

? ? var fn = function(){......};//我自己的插件方法


????//暴露给全局作用域

????window.fn = fn;

? ? //或者是暴露给当前函数的外层作用域(推荐)

? ? this.fn = fn;

}());

逼格高一点的会在这个自执行函数IIF里面放一个,暂且不考虑window还是当前作用域。

!('myFn' in window) && (window.myFn = myFn);

这里的(‘myFn’ in Obj)方法是判断window下面有没有键为‘myFn’的方法,如果有则返回true。

为了提高插件中语法的严谨性好多人都在自执行函数内部或者局部使用严格模式"use strict";

;(function(){

????"use strict"

}());

严格模式的特点不在这里做过多的赘述,但是在这里有一点要清楚,

在严格模式下会抑制 this

举个例子:

;(function()

? ? "use strict";

? ? console.log(this)

})

//输出的结果为undefined

????说了这么多,我们今天的重点来了:如何解决这一问题,就需要我们的eval来获取当前上下文对象

? ? js 中 eval() 函数的作用就是讲函数内的参数当做代码来执行。

? ? 比如eval('1+1')得到的值为2,然而如果直接打印‘1+1’他就是一个字符串,eval(‘this’)得到的就是this。

? ? 很多插件中都有这句话(0,eval)('this')。这时候就涉及到了eval的直接引用和间接引用以及逗号表达式。逗号表达式是执行顺序等级最低的,如果(1,eval)会先执行逗号前面的式子(逗号前面也会当做一个表达式),最终会执行eval()。

????但是(0,eval)('this')和eval('this')同样是执行eval,但他们有什么区别呢,下面是间接引用和直接引用的方法。

间接引用

(1, eval)('...')

(eval, eval)('...')

(1 ? eval : 0)('...')

(__ = eval)('...')vare = eval; e('...')

(function(e) { e('...') })(eval)

(function(e) {returne })(eval)('...')

(function() { arguments[0]('...') })(eval)this.eval('...')this['eval']('...')

[eval][0]('...')

eval.call(this, '...')

eval('eval')('...')

直接引用

eval('...')

(eval)('...')

(((eval)))('...')

(function() { return eval('...') })()

eval('eval("...")')

(function(eval) { return eval('...'); })(eval)

with({ eval: eval })eval('...')

with(window) eval('...')

? ? 通过上面大致看一眼,我们可以理解,间接引用大部分都是表达式,表达式计算出来的是一个值,而直接引用就是一个引用,个人理解由于在严格模式下对this的引用是有限制的,所以如果转换成了值就可以直接获取到正确的this指向了。(如果异议请留下您的宝贵意见)

????所以我们需要间接引用eval来获取准确的this指向,才可以将他暴露给当前函数的作用域。

? ??(0,eval)('this')不管逗号前面是什么数字,都可以。

????所以,逼格再高一点的会在这个自执行函数IIF里面放

;(function(){

? ? 'use strict'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //设置为严格模式

? ? var myFn = function(){......};? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //我的插件方法

????_global = (function(){ return this || (0, eval)('this'); }());? ? ? ? ? ? ? ? ? ? //查找当前作用域,也就是this的指向,也就是找到顶层对象;这里不了解的可以查看阮一峰老师的《 ECMAScript 6 入门 》第一章,“global对象 ”

????!('myFn' in _global) && (_global.myFn = myFn);? ? ? ? ? ? ? ? ? ? ? ? ? ? //暴露

}())




? ? 逗号表达式问题扩展:

? ?如何不通过第三个变量来改变ab两个变量的值?

var a = 'a' , b = 'b';

a = [b,b=a][0]

console.log(a,b)//打印出b,a

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,028评论 0 2
  • @转自GitHub 介绍js的基本数据类型。Undefined、Null、Boolean、Number、Strin...
    YT_Zou阅读 1,149评论 0 0
  • 前端开发面试题 <a name='preface'>前言</a> 只看问题点这里 看全部问题和答案点这里 本文由我...
    自you是敏感词阅读 757评论 0 3
  • 在你最悲观最失望的时候,那正是你必须鼓起坚强的信心的时候。 你们现在要离开母校了,我没有什么礼物送给你们,只好送你...
    孚光阅读 568评论 0 0
  • 开车去景区要经过一长段山区公路。山路弯弯,双向只有两车道。路面狭窄,时不时的交汇车必须聚精会神。 在返程时,突然从...
    Nunu0077阅读 318评论 0 0