资讯专栏INFORMATION COLUMN

拜读jQuery(1)--globalEval

anyway / 2753人阅读

摘要:去年暑假的时候开通了博客园,然后开始找工作,至今为止只写了一篇文章。惭愧啊今天兴致来了,投身博客园,尼玛,密码忘记了。即有所谓的函数名函数名。获取对的使用去除字符串两端的空格说明是严格模式,不能直接使用函数非严格模式

今天第一次在segmentfault里写文章。去年暑假的时候开通了博客园,然后开始找工作,至今为止只写了一篇文章。惭愧啊!今天兴致来了,投身博客园,尼玛,密码忘记了。看了那么无聊的找回密码,果断转投于此,但愿我以后能够坚持写点东西。毕竟,好好记性不如烂笔头。
公司不让去实习,在学校待的无聊,前两天再写东西的时候,突然意识到,已经大半年没有写过jQuery了。但看到那么多熟悉API,不想再去做重复的工作,果断找到源码,投入分析。
看源码的进程缓慢,但收获确实挺大,尤其有利于扎实js底层知识。今天看到了源码里面globalEval方法的实现。虽然用的不多,但是实现方法着实让人眼前一惊(大神不算)。所以就从这里开始我的文章生涯吧!!

eval和window.eval

对于eval基本的用法,对于任何一位前端来说,都不会陌生。jQuery源码里面也有其基本使用,但是用法。可视我第一次见啊啊啊啊。
我们知道,当我们在全局声明一个函数的时候,就相当于在window对象上面添加了一个方法。即有所谓的:函数名===window.函数名。以前在使用eval()函数的时候,也想当然的认为eval===window.eval。其实,两者的用法差距挺大的。

function create()
{
    eval("var a = 2");   //和在函数里面直接var a = 2;的效果是一样的
    window.eval("var b = 3");  //这种其实是在全局作用域里面声明了变量 b
}

//调用函数
create();
consoole.log(a);  //报错:a is not defined
console.log(b);   // 3

从上面的函数里面,我们就可以看出eval就是把其参数在当前的作用域里面运行。而window.eval无论其处于什么作用域里,都会把其参数在全局作用域里面运行。

除了直接使用window.eval外,我们也可以使用一个变量对其进行引用

function create(){
{
    var ev = eval;   //js就是这么神奇,这里的eval指的是window.eval,而非对eval的直接引用
    ev("var c = 4");
}
create();
console.log(c); //4

js果然是一门神奇的语言,那么小的一个玩意竟然会有那么多想不到的用法。
其实啊,eval在多带带使用的时候,js语言其实是把它作为一个结构体来看待,而window.eval在使用的时候,却真真是一个函数。

下面附上jQuery里面globalEval的源码

//自己试着写的,顺便使用了经常使用的去除两端空格的方法。
String.prototype.trim = function(){
    return this.replace(/^(s+)|(s)+$/g,"");
};
jQuery.globalEval = function(code){
    var newScript,
        newEval = eval;   //获取对eval的使用
     
     code = code.trim();  //去除字符串两端的空格
     
     if(code){
         if(code.indexOf("use strict")){
             //说明是严格模式,不能直接使用window.eval函数
             newScript = document.createElement("script");
             newScript.createTextNode(code);
             document.head.appendChild(newScript).parentNode.removeChild(newScript);
         }else{
             //非严格模式
             newEval(code);
         }
     }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78982.html

相关文章

  • jQuery源码解读:部份jQuery工具方法实现

    摘要:作为前端最流行的类库,没有之一,源码必须得读一读。本博将不定期更新源码解读内容,如果解读不正确的地方,还请同学们在评论中指正。这里使用的是改变的指向为实例。其实就是中常见的四判断是否是数字函数用于检查其参数是否是无穷大。 jQuery作为前端最流行的类库,没有之一,源码必须得读一读。本博将不定期更新源码解读内容,如果解读不正确的地方,还请同学们在评论中指正。 本系列文章基于jquer...

    Rindia 评论0 收藏0
  • 原生js替换jQuery各种方法-中文版

    摘要:本项目总结了大部分替代的方法,暂时只支持以上浏览器。返回指定元素及其后代的文本内容。从服务器读取数据并替换匹配元素的内容。用它自己的方式处理,原生遵循标准实现了最小来处理。当全部被解决时返回,当任一被拒绝时拒绝。是创建的一种方式。 原文https://github.com/nefe/You-D... You Dont Need jQuery showImg(https://segmen...

    lylwyy2016 评论0 收藏0
  • jQuery is out of date

    摘要:注同时移除元素上的事件及数据。其他对象通过其属性名进行迭代。原始数组不受影响。检查对象是否为空不包含任何属性。返回一个数字,表示当前时间。两者性能差不多接受一个标准格式的字符串,并返回解析后的对象。 在我看来,jQuery确实已经过时了。本项目总结了绝大部分 jQuery API 替代的方法,类似项目You-Dont-Need-jQuery,并会再此基础上进行很多的补充。写这个项目主要...

    duan199226 评论0 收藏0
  • jQuery源码分析-整体架构(转)

    摘要:文章出处拜读一个开源框架,最想学到的就是设计的思想和实现的技巧。利用下的简单工厂模式,来将所有对于同一个对象的操作指定同一个实例。所以的中提供了以上中扩展函数。 文章出处 http://www.cnblogs.com/aaronjs/p/3278578.html 拜读一个开源框架,最想学到的就是设计的思想和实现的技巧。 废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过,...

    voidking 评论0 收藏0

发表评论

0条评论

anyway

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<