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

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,
				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()无效。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值