我的javascript代码遇到了问题。
我有一个班级MyClass
,并在其原型中添加了函数myFunction
。
MyClass.prototype.myFunction = function(file){
if(some condition){
fs.exists("./" + file, function(exists){
if(exists)
console.log(this.someValue);
/* lot of other code */
else
/* do something else */
});
}else{
/* do something */
}
}
我的问题是this.someValue
的范围(作为一个例子,我想打印它)。
每次exists
等于true
时,控制台会记录undefined
,但事实并非如此。
如果我将它打印在fs.exists()
之外,那么它有一个值,所以我猜这是一个范围问题。
如何在此示例中访问this.someValue
?
提前致谢!
答案 0 :(得分:4)
你必须.bind
你的内在功能
MyClass.prototype.myFunction = function(file){
if(some condition){
fs.exists("./" + file, function(exists){
if(exists)
console.log(this.someValue);
/* lot of other code */
else
/* do something else */
}.bind(this));
}else{
/* do something */
}
}
这可以改写为更清洁
MyClass.prototype.myFunction = function myFunction(file){
if(some condition){
fs.exists("./" + file, this.doSomething.bind(this));
}
else{
// do something else
}
}
MyClass.prototype.doSomething = function doSomething(exists) {
if(exists) {
console.log(this.someValue);
// lot of other code
}
else {
// do something else
}
}
我个人喜欢这个解决方案,因为它可以让您保持优秀的代码组合并阻止您嵌套function(){ function(){ function(){ ... }}}
。它还可以防止你有一堆var that = this;
或var self = this;
变量浮动,让你想知道哪个范围是哪个。
.bind
速度较慢,是的,但正如minitech指出的那样,与文件访问相比,它肯定不会成为你的瓶颈。
答案 1 :(得分:3)
MyClass.prototype.myFunction = function(file){
var that = this;
// some lines of code later...
console.log(that.someValue);
}
答案 2 :(得分:2)
作为this
- 是由函数范围定义的关键字,并响应函数的所有者或调用者。因此,您可以将其指针存储在另一个变量中:
MyClass.prototype.myFunction = function(file) {
if(some condition) {
var self = this; // create variable with pointer to 'this'
fs.exists("./" + file, function(exists) {
if(exists) {
console.log(self.someValue); // we can access it to parent scope variables
/* lot of other code */
} else {
/* do something else */
}
});
} else {
/* do something */
}
}
同时查看这个精彩主题:How does the "this" keyword work?