本日第一次在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);
}
}
}