我在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) );}]
));
答案 0 :(得分:1)
这在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
。
答案 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
对象。