0

問題があれば、Firefox 3.6.11 でテストを実行しましたが、call と apply のコンテキストで 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) );}]
        ));
4

2 に答える 2

1

これはjavascriptで関数を呼び出すオブジェクトであり、使用する場合はobject.function()thenでthisあり、object使用する場合はfunction.call(object,...)thenであり、使用する場合はobjectであり、使用する場合はthen thisisであり、それ以外の場合はブラウザにあります。objectfunction.apply(object,...)thisnew constructor(...)thisnew constructed objectthisthe global objectwindow

于 2010-10-27T04:42:01.850 に答える
0

callは、最初の引数としてthis(こちらを参照) の値を受け取ります。したがって、機能する最初の行で

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

disあなたは を指すそれを渡しているevaltestので、をthis.testValue指しevaltest.testValueます。

機能しない2行目

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

に渡すのでnull、ウィンドウのオブジェクトに設定されます。thisthis.testValuethis.testValue

于 2010-10-27T04:32:29.547 に答える