大家好,今天来为大家解答深入解析插件中的关键代码角色:`(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,本文到此结束,如果可以帮助到大家,还望关注本站哦!
【深入解析插件中的关键代码角色:`(0,eval)('this')`的奥秘】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这个题目听起来很专业呀!感觉是关于编程和代码方面的知识吧?
有15位网友表示赞同!
(0,eval)是什么意思啊,我有点 confused...
有6位网友表示赞同!
希望文章能解释清楚,这种东西一般是怎么用在插件里的呢?
有14位网友表示赞同!
我想了解一下这种方法的优缺点,以及它的应用场景比较多吗?
有14位网友表示赞同!
看标题就感觉很神奇,是不是可以操控插件的功能?
有16位网友表示赞同!
学习一下这种技巧,说不定以后可以帮到我在开发中。
有10位网友表示赞同!
这听起来很有用!如果能简明易懂地解释,我非常期待啊!
有8位网友表示赞同!
这个题目好抽象啊,感觉离我日常的生活很远。
有7位网友表示赞同!
是不是可以用这种方法来增强插件的功能?
有20位网友表示赞同!
文章会不会有案例分析呢?这样学习会更有针对性。
有13位网友表示赞同!
有没有什么开源代码可以参考?这样能更快地了解这个概念。
有13位网友表示赞同!
我比较好奇 (0,eval) 在现实生活中有什么应用场景?
有5位网友表示赞同!
这种方法安全吗?会不会被恶意利用?
有8位网友表示赞同!
是不是只有程序员才会用到这样的知识?
有19位网友表示赞同!
感觉这种操作可能会很复杂,需要一定的编程基础才能理解。
有16位网友表示赞同!
我也在做一些插件开发,这篇文章也许能给我带来新的启发。
有5位网友表示赞同!
之前很少接触过类似的东西,看了文章或许会有新认识。
有18位网友表示赞同!
希望这篇文章能解释得清晰易懂,方便我理解这种技术原理。
有13位网友表示赞同!
期待学习更多关于插件开发的知识!
有18位网友表示赞同!