Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript上下文_Javascript_Scope - Fatal编程技术网

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);