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
jQuery中的工具方法globalEval(),无论在什么条件下, 都在全局作用域中执行代码。
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 ) {
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对话框中显示的内容:
$.globalEval('"use strict";var foo = 3')
console.log(foo); //3
在console对话框中显示的内容:
eval('"use strict";var foo = 3')
console.log(typeof foo); //undefined
总结: 严格模式只对直接使用eval()有效 ,对间接使用的eval()无效。