JavaScript上下文
===============JavaScript上下文,javascript,scope,Javascript,Scope,=============== 代码显示的警报为“年龄=未定义”。我理解为User.Show函数是从Test()内部调用的,指的是Test()函数的this而不是User对象。我的问题是,是否有办法解决这个问题?让它在用户的作用域上执行的一种方法是通过测试函数a作用域 var User = { Name: "Some Name", Age: 26, Show: function() { alert("Age= "+this.Age)}; }; function Test(fn
代码显示的警报为“年龄=未定义”。我理解为User.Show函数是从Test()内部调用的,指的是Test()函数的this而不是User对象。我的问题是,是否有办法解决这个问题?让它在
用户
的作用域上执行的一种方法是通过测试
函数a作用域
var User = {
Name: "Some Name", Age: 26,
Show: function() { alert("Age= "+this.Age)};
};
function Test(fn) {
fn();
}
Test(User.Show);
这将把传递的函数应用于传递的作用域,如果没有传递作用域,则应用于窗口
测试(User.Show,User)
会提醒Age=26
您有两个错误。第一个是分号应该移到}的内部,但如果您想按原样调用它并让它显示年龄,代码应该是函数(){alert(“Age=“+User.Age”);}
。解决此问题的方法是在测试函数内部传入您要定义“this”范围的对象
function Test(fn, scope) {
fn.apply(scope || window);
}
function Test(fn, scope, args) {
fn.apply(scope, args);
}
Test(User.Show, User, []);
其中,args数组允许您另外传入可能有的任何参数。您也可以让测试函数保持原样,只需传入一个匿名函数
function Test(fn, scope) {
fn.apply(scope || window);
}
function Test(fn, scope, args) {
fn.apply(scope, args);
}
Test(User.Show, User, []);
您也可以这样做:
Test(function() {User.Show()});
考虑到要使用其他建议,您仍然必须将范围作为参数传递,例如:
Test(User.Show.bind(User));
另一种选择似乎是合理和容易的
此外,您可能会发现本文很有趣:
它解释了您面临的问题类型以及解决问题的方法。比我在这里写的任何回答都要好:) 变量用户={ 名字:“某个名字”, 年龄:26,, Show:function(){alert(“Age=“+User.Age”)} }; 功能测试(fn){ fn(); } 测试(User.Show); ps!引用“Test()”函数的“this”而不是“User” 否-事实上,“this”指向窗口对象
你可能会发现John Resig的幻灯片很有趣,特别是关于分号的部分只是一个打字错误,jordan s jones所说的实际上是我在寻找的东西,或者可能是更好的东西。对。在JavaScript中,根据ECMA标准,
user.show
只是函数show
。您需要的是一个新函数,它记住user
是要使用的this
对象。不,您不能。至少不是在所有浏览器中。
var User = {
Name: "Some Name",
Age: 26,
Show: function() { alert("Age= "+this.Age);}
};
function Test(fn,obj) {
fn.call(obj);
}
Test(User.Show, User);