拜读jQuery(1)--globalEval

公司不让去实习,在学校待的无聊,前两天再写东西的时候,突然意识到,已经大半年没有写过jQuery了。但看到那么多熟悉API,不想再去做重复的工作,果断找到源码,投入分析。
看源码的进程缓慢,但收获确实挺大,尤其有利于扎实js底层知识。今天看到了源码里面globalEval方法的实现。虽然用的不多,但是实现方法着实让人眼前一惊(大神不算)。所以就从这里开始我的文章生涯吧!!

  • eval和window.eval

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

 1 function create()
 2 {
 3     eval('var a = 2');   //和在函数里面直接var a = 2;的效果是一样的
 4     window.eval('var b = 3');  //这种其实是在全局作用域里面声明了变量 b
 5 }
 6 
 7 //调用函数
 8 create();
 9 consoole.log(a);  //报错:a is not defined
10 console.log(b);   // 3

 


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

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

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

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

下面附上jQuery里面globalEval的源码

 1 //自己试着写的,顺便使用了经常使用的去除两端空格的方法。
 2 String.prototype.trim = function(){
 3     return this.replace(/^(\s+)|(\s)+$/g,'');
 4 };
 5 jQuery.globalEval = function(code){
 6     var newScript,
 7         newEval = eval;   //获取对eval的使用
 8      
 9      code = code.trim();  //去除字符串两端的空格
10      
11      if(code){
12          if(code.indexOf("use strict")){
13              //说明是严格模式,不能直接使用window.eval函数
14              newScript = document.createElement('script');
15              newScript.createTextNode(code);
16              document.head.appendChild(newScript).parentNode.removeChild(newScript);
17          }else{
18              //非严格模式
19              newEval(code);
20          }
21      }
22 }

 

posted @ 2016-03-22 20:28  抓不住前端的尾巴  阅读(83)  评论(0)    收藏  举报