您的位置:首页 > Web前端 > JQuery

jQuery工具方法globalEval()——全局解析JS

2017-11-20 21:10 519 查看
globalEval():实际就是全局的eval()函数,并且做了兼容处理。

首先理解eval()函数:

eval()函数执行一段JavaScript代码字符串,只有直接使用eval()本身,会在当前作用域中执行代码,否则相当于在全局作用域中执行代码。

例1.直接使用eval()本身,相当于在当前作用域执行代码:

var foo = 1;
function test() {
var foo = 2;
eval('foo = 3');
return foo;
}
console.log(test()); // 3
console.log(foo); // 1例2.通过window.eval(),代码将在全局作用域执行:
var foo = 1;
function test() {
var foo = 2;
window.eval('foo = 3');
return foo;
}
console.log(test()); // 2
console.log(foo); // 3
例3.将eval赋值给其他变量,间接使用,代码将在全局作用域执行
var foo = 1;
function test() {
var foo = 2;
var indirect = eval;
indirect('foo = 3');
return foo;
}
console.log(test()); // 2
console.log(foo); // 3
eval()函数在严格模式下:eval中的代码不能创建eval所在作用域下的变量、函数。而是为eval单独创建一个作用域,即严格模式创设了第三种作用域:eval作用域,并在eval返回时丢弃。
"use strict";
var foo = 1;
function test() {
var foo = 2;
eval('var foo = 3');
return foo;
}
console.log(test()); // 2
console.log(foo); // 1
"use strict";
eval('var foo = 3');
console.log(typeof foo); //undefined
严格模式下,间接使用:没有eval作用域,仍是全局作用域执行。
"use strict";
var indirect = eval;
indirect('var foo = 3');
console.log(foo);//3
"use strict";
function test(){
var indirect = eval;
indirect('var foo = 3')
}
test();
console.log(typeof foo); //number

在严格模式下,通过window调用,没有eval作用域
"use strict";
var indirect = eval;
window.eval('var foo = 3');
console.log(foo);//3

总结:严格模式只对直接使用eval()有效,对间接使用的eval()无效。

jQuery中的工具方法globalEval(),无论在什么条件下,都在全局作用域中执行代码
globalEval: function( code ) {
var script,

4000
indirect = eval;

code = jQuery.trim( code );

if ( code ) {
// If the code includes a valid, prologue position
// strict mode pragma, execute code by injecting a
// script tag into the document.
if ( code.indexOf("use strict") === 1 ) {
script = document.createElement("script");
script.text = code;
document.head.appendChild( script ).parentNode.removeChild( script );
} else {
// Otherwise, avoid the DOM node creation, insertion
// and removal by using an indirect global eval
indirect( code );
}
}
},
"use strict";
$.globalEval('var foo = 3')
console.log(foo); //3
修改
globalEval: function( code ) {
var script,
indirect = eval;

code = jQuery.trim( code );

if ( code ) {
// If the code includes a valid, prologue position
// strict mode pragma, execute code by injecting a
// script tag into the document.
if ( code.indexOf("use strict") === 1 ) {
console.log("创建script标签");
script = document.createElement("script");
script.text = code;
document.head.appendChild( script ).parentNode.removeChild( script );
} else {
// Otherwise, avoid the DOM node creation, insertion
// and removal by using an indirect global eval
indirect( code );
console.log("间接使用");
}
}
}
"use strict";
$.globalEval('var foo = 3')
console.log(foo); //3
在console对话框中显示的内容:

间接使用
jquery-2.0.3.js:551

3

$.globalEval('"use strict";var foo = 3')
console.log(foo); //3
在console对话框中显示的内容:

创建script标签
jquery-2.0.3.js:543

3

eval('"use strict";var foo = 3')
console.log(typeof foo); //undefined

总结:严格模式只对直接使用eval()有效,对间接使用的eval()无效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: