我在互联网上看到人们使用以下构造来获取Global对象
(1,eval)('this')
或者
(0||eval)('this')
您能解释一下它的确切工作方式以及优于window
,top
等的好处吗?
UPD :测试直接与间接eval
来电:http://kangax.github.io/jstests/indirect-eval-testsuite/
答案 0 :(得分:2)
(1,eval)('this')
相当于eval('this')
(0||eval)('this')
相当于eval('this')
所以(1,eval)或(0 || eval)是产生 eval
的表达式喜欢在:
var x = 2;
console.log( (10000, x) ); // will print 2 because it yields the second variable
console.log( (x, 10000) ); // will print 10000 because it yields the second literal
console.log( (10000 || x) ); // will print 10000 because it comes first in an OR
// expression
此处唯一的 catch 表示从表达式返回的对象始终是具有最大全局范围的对象。
检查代码:
x = 1;
function Outer() {
var x = 2;
console.log((1, eval)('x')); //Will print 1
console.log(eval('x')); //Will print 2
function Inner() {
var x = 3;
console.log((1, eval)('x')); //Will print 1
console.log(eval('x')); //Will print 3
}
Inner();
}
Outer();