拜读jQuery(1)--globalEval

本日第一次在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);
         }
     }
}
    原文作者:2json
    原文地址: https://segmentfault.com/a/1190000004655856
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞