9

我在网上看到人们使用以下构造来获取全局对象

(1,eval)('this')

或这个

(0||eval)('this')

你能解释一下它到底是如何工作的以及对 , 等的好处windowtop

UPD:测试直接与间接eval调用: http: //kangax.github.io/jstests/indirect-eval-testsuite/

4

1 回答 1

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

这里唯一注意的是,从表达式返回的对象始终是具有最大全局范围的对象。

检查该代码:

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();
于 2013-09-19T07:51:52.113 回答