欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析插件中的关键代码角色:`(0,eval)('this')`的奥秘

时间:11-07 现代故事 提交错误

大家好,今天来为大家解答深入解析插件中的关键代码角色:`(0,eval)("this")`的奥秘这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

对eval 的间接和直接引用

逗号运算符的作用

现在网络上有很多插件。他们不仅拥有美丽的外表,而且还拥有良好的性能。不管有多少插件,产品的想法就有很多。然而,很多时候在开发过程中,我们需要为自己的项目封装一些常用的功能,这样就大大提高了代码的复用率。

封装过程中有一个步骤,就是把自己的函数暴露给当前的应用程序或者世界。

一般建议将其暴露给当前范围,这就是重点。

;(功能(){

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

//暴露到全局范围

窗口.fn=fn;

//或者暴露到当前函数的外部作用域(推荐)

这个.fn=fn;

}());

更高级的人会在这个自执行函数IIF中放一个,无论窗口或当前范围如何。

!("myFn" 在窗口中) (window.myFn=myFn);

这里的("myFn" in Obj)方法是判断窗口下是否存在键为"myFn"的方法。如果有则返回true。

为了提高插件中语法的严谨性,很多人在自执行函数内部或者本地使用严格模式‘use strict’;

;(功能(){

"使用严格"

}());

严格模式的特点这里不会过多描述,但是这里有一点需要明确。

这在严格模式下被抑制

例如:

;(功能()

"使用严格";

控制台.log(这个)

})

//输出结果未定义

说了这么多,我们今天的重点是:如何解决这个问题,需要我们的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,评估)(".")

(评估,评估)(".")

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

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

(函数(e) { e(".") })(eval)

(函数(e) {返回})(eval)(".")

(function() { 参数[0](".") })(eval)this.eval(".")this["eval"](".")

[评估][0](".")

eval.call(这个, ".")

评估("评估")(".")

直接报价

评估(".")

(评估)(".")

(((评估)))(".")

(函数() { 返回eval(".") })()

评估("评估(".")")

(函数(eval) { return eval("."); })(eval)

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

与(窗口)评估(".")

从上面我们可以看出,大部分的间接引用都是表达式。表达式计算一个值,而直接引用是一个引用。个人理解是严格模式下对this的引用是有限制的。所以如果转成值的话,可以直接得到正确的this指针。 (如有异议,请留下宝贵意见)

因此,我们需要间接引用eval 来获取准确的this 指针,然后才能将其暴露给当前函数的作用域。

(0,eval)("this") 与逗号前面的数字无关。

所以,如果你比较高级的话,就会放到这个自执行函数IIF里面。

;(功能(){

"use strict" //设置为严格模式

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

_global=(function(){ return this || (0, eval)("this"); }()); //查找当前作用域,也就是this的重点,即找到顶层对象;这里不太明白你可以查看阮一峰老师的《

ECMAScript 6 入门

》第一章“全局对象

!("myFn" in _global) (_global.myFn=myFn); //裸露

}())

逗号表达式问题扩展:

如何在不传递第三个变量的情况下改变两个变量ab的值?

var a="a" , b="b";

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

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

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

用户评论

一笑抵千言

这个题目听起来很专业呀!感觉是关于编程和代码方面的知识吧?

    有15位网友表示赞同!

糖果控

(0,eval)是什么意思啊,我有点 confused...

    有6位网友表示赞同!

南宫沐风

希望文章能解释清楚,这种东西一般是怎么用在插件里的呢?

    有14位网友表示赞同!

娇眉恨

我想了解一下这种方法的优缺点,以及它的应用场景比较多吗?

    有14位网友表示赞同!

屌国女农

看标题就感觉很神奇,是不是可以操控插件的功能?

    有16位网友表示赞同!

淡抹丶悲伤

学习一下这种技巧,说不定以后可以帮到我在开发中。

    有10位网友表示赞同!

执念,爱

这听起来很有用!如果能简明易懂地解释,我非常期待啊!

    有8位网友表示赞同!

北朽暖栀

这个题目好抽象啊,感觉离我日常的生活很远。

    有7位网友表示赞同!

Edinburgh°南空

是不是可以用这种方法来增强插件的功能?

    有20位网友表示赞同!

命硬

文章会不会有案例分析呢?这样学习会更有针对性。

    有13位网友表示赞同!

青山暮雪

有没有什么开源代码可以参考?这样能更快地了解这个概念。

    有13位网友表示赞同!

£烟消云散

我比较好奇 (0,eval) 在现实生活中有什么应用场景?

    有5位网友表示赞同!

珠穆郎马疯@

这种方法安全吗?会不会被恶意利用?

    有8位网友表示赞同!

愁杀

是不是只有程序员才会用到这样的知识?

    有19位网友表示赞同!

封锁感觉

感觉这种操作可能会很复杂,需要一定的编程基础才能理解。

    有16位网友表示赞同!

傲世九天

我也在做一些插件开发,这篇文章也许能给我带来新的启发。

    有5位网友表示赞同!

昂贵的背影

之前很少接触过类似的东西,看了文章或许会有新认识。

    有18位网友表示赞同!

你的眸中有星辰

希望这篇文章能解释得清晰易懂,方便我理解这种技术原理。

    有13位网友表示赞同!

服从

期待学习更多关于插件开发的知识!

    有18位网友表示赞同!

【深入解析插件中的关键代码角色:`(0,eval)('this')`的奥秘】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活