Как JavaScript Eval обрабатывает «это» - PullRequest
0 голосов
/ 27 октября 2010

Я запускал тесты в 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 ]

1 голос
/ 27 октября 2010

это в javascript объект, который вызвал функцию, когда вы используете object.function(), тогда this равно object, когда вы используете function.call(object,...), то this равно object, когда вы используете function.apply(object,...), тогда this является объектом, когда вы используете new constructor(...), тогда this равно new constructed object, в противном случае this это the global object в браузере это window.

0 голосов
/ 27 октября 2010

call принимает в качестве первого аргумента значение this (см. здесь ). Итак, в первой строке это работает

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 окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...