我正在尝试按如下方式设置功能。</ p>
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
?
答案 0 :(得分:1)
将其作为参数传递
function Class(){
}
Class.prototype.func=function(f){
var hello="hello";
setTimeout(function(){
f(hello)
},1000);
};
new Class().func(function(hello){
alert(hello);
});
答案 1 :(得分:0)
它不能。该变量根本不存在于定义函数的范围内。
您需要将其公开到更广泛的范围(例如,将其设为Class
对象实例的属性或全局属性。)
答案 2 :(得分: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()
可以解决这种情况。)