0

我正在尝试按如下方式设置功能。

function Class() {
}

Class.prototype.func = function(f) {
    var hello = "hello";
    setTimeout(f, 1000);
};

new Class().func(function() {
    alert(hello);
});

我希望该f()函数能够访问 hello 变量。问题是它f()没有在函数的上下文中func()运行。

我尝试过使用var hello = "hello";this.hello = "hello";但都没有工作。

怎么能f()访问hello

4

3 回答 3

1

将其作为参数传递

function Class(){
}
Class.prototype.func=function(f){
    var hello="hello";
    setTimeout(function(){
        f(hello)
    },1000);
};
new Class().func(function(hello){
    alert(hello);
});
于 2013-05-20T15:52:32.037 回答
0

它不能。该变量根本不存在于定义函数的范围内。

您需要将其暴露给更广泛的范围(例如,通过使其成为对象实例的Class属性或全局属性)。

于 2013-05-20T15:52:04.923 回答
0

鉴于您所拥有的代码结构,任何传递给“func”的“f”都无法访问“hello”。

但是,您可以这样做:

Class.prototype.func=function(f){
    this.hello="hello";
    setTimeout(f.bind(this),1000);
};
new Class().func(function(){
    alert(this.hello);
});

JavaScript 作用域基于函数之间的词法关系(声明上下文)。声明的变量var可用于声明它的函数,以及该函数中声明/实例化的所有函数。在您的情况下,匿名函数在“func”内声明,因此“func”的局部变量永远不会对它可见。也没有办法从“func”内部动态地公开本地范围。(在回答这样的问题时,我通常会忘记忽略,但在这里我认为甚至无法解决这种情况。)eval()eval()

于 2013-05-20T15:52:13.370 回答