2010-10-27 25 views
0

J'ai exécuté des tests dans Firefox 3.6.11, si cela est important, et eval se comporte mal dans le contexte de l'appel et de l'application. Il saute d'une manière ou d'une autre sur l'objet 'this' actuel. Pourquoi?Comment javascript eval gère-t-il '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));}] 
     )); 

Répondre

0

call prend en, comme premier argument, la valeur de this (voir here). Ainsi, dans la première ligne qui fonctionne

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

vous passez ce dis qui pointe vers evaltest, donc this.testValue points evaltest.testValue.

Dans la deuxième ligne qui ne fonctionne pas

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

vous le transmettre null pour this, donc this.testValue est réglé objet this.testValue de la fenêtre.

1

ceci à javascript est un objet qui a appelé la fonction, lorsque vous utilisez object.function() alors this est object, lorsque vous utilisez function.call(object,...) alors this est object, lorsque vous utilisez function.apply(object,...) alors this est objet, lorsque vous utilisez new constructor(...) puis this est new constructed object, sinon this est the global object dans le navigateur il est window.

+0

@Dmitri: Peut-être qu'il croit que 'eval' n'est pas le problème avec votre code. Et s'il vous plaît soyez un peu plus courtois avec les gens qui essaient de vous aider. – Chetan