javascript eval如何处理'this'

时间:2010-10-27 04:19:13

标签: javascript eval call apply

我在Firefox 3.6.11中运行测试,如果这很重要,并且eval在调用和应用的上下文中行为不当。它以某种方式跳过当前的'this'对象。为什么呢?

dojo.provide("yal-js.tests.javascript");

function evaltest () {
    var dis=this;
    // it works now... returns 2 on call and apply
    return eval("(function() {return this.testValue;}).call(dis);");
    // this, however, didn't work: it returned 1, not 2
    //return eval("(function() {return this.testValue;})();");
}
function controltest() {
    return this.testValue;
}

var testValue=1;
var testObj={testValue: 2};

doh.register("tests.javascript",
    new TFRunGroup(

        ["direct",
            function () {doh.assertEqual(1,controltest());} ],
        ["call",
            function() {doh.assertEqual(2, controltest.call(testObj) );}],
        ["apply",
            function() {doh.assertEqual(2, controltest.apply(testObj) );}],
        ["eval direct",
            function () {doh.assertEqual(1,evaltest());} ],
        ["eval call",
            function() {doh.assertEqual(2, evaltest.call(testObj) );}],
        ["eval apply",
            function() {doh.assertEqual(2, evaltest.apply(testObj) );}]
        ));

2 个答案:

答案 0 :(得分:1)

这在javascript是一个调用函数的对象, 当您使用object.function()时,thisobject, 当您使用function.call(object,...)时,thisobject, 当您使用function.apply(object,...)时,this是对象, 当您使用new constructor(...)时,thisnew constructed object, 否则this在浏览器中为the global objectwindow

答案 1 :(得分:0)

call作为第一个参数,接受this的值(请参阅here)。所以在第一行工作

return eval("(function() {return this.testValue;}).call(dis);");

您传递的dis指向evaltest,因此this.testValue指向evaltest.testValue

在第二行不起作用

return eval("(function() {return this.testValue;})();");

您正在为null传递this,因此this.testValue设置为窗口的this.testValue对象。