我对C#和Java有一些经验,但我正在尝试学习javascript / node.js。我无法弄清楚这段代码的问题。
所以我有if (vtype[i] == "OtherView") && (cattypelink == "Image")
{
print("i is \(i)")
imagestrng = demoarray[i]
self.imgtag = i
self.tag = self.imgtag
print("imagestring is sswqqwqew \(imagestrng)")
let actualURL = URL(string: imagestrng)
self.downloadImage(with: actualURL!)
}
func downloadImage(with url:URL) {
print("inside download image")
SDWebImageManager.shared().downloadImage(with: url, options: SDWebImageOptions(rawValue: 0), progress: nil) { (image, _, _, _, _) in
if let _ = image {
print("image downloaded")
if self.tag == self.imgtag
{
var finalimage: UIImage = image!
print("finalimage is \(finalimage)")
self.othersimg = UIImageView(frame: self.oview.frame)
self.othersimg?.image = nil
self.othersimg?.image = finalimage
self.oview = UIView(frame: CGRect(x:0,y:0,width:self.sigeImg.width,height:self.sigeImg.height))
self.mainview.addSubview(self.oview)
self.oview.addSubview(self.othersimg!)
self.othersimg?.tag = self.imgtag
print("othersimg is \(self.othersimg?.tag)")
}
else
{
print("nothing")
}
}
else {
print("not downloaded '")
// Try to download again (optional)
self.downloadImage(with: url)
}
}
}
文件,它有以下代码:
main.js
它正在调用的const MyClass = require("./MyClass");
let myclass = new MyClass("my string!");
myclass.repeatString();
有以下代码:
MyClass
当我尝试运行它时,我在尝试执行class MyClass {
constructor(myString) {
this.myString = myString;
}
repeatString() {
console.log(myString);
}
}
module.exports = MyClass;
方法时得到ReferenceError: myString is not defined
。我做错了什么/做这件事的正确方法是什么?
答案 0 :(得分:4)
与Java这样的语言不同,我们可以在不使用this
的情况下引用类中的变量,在JavaScript中使用this
绑定behaves much differently,与范围界定一样。
在Java中,这是合法的:
class Test {
int i;
void method() {
System.out.print(i); // <-- Java compiler knows to look for the `i` on the class instance (technically it first looks for `i` locally in the scope of `method` and the goes to look on the class)
}
}
在JavaScript中,我们没有这种行为,因此没有类变量(yet)。
class Test {
i; // <-- Uncaught SyntaxError: Unexpected token ;
method() {
console.log(i);
}
}
&#13;
对于您的示例,这意味着在引用类中存在的变量(技术上在对象实例上)时,始终需要使用this
。
因此,您必须使用this.myString
:
repeatString() {
console.log(this.myString);
}
您正在获取Reference Error
,因为引擎会尝试从myString
的范围开始向上查找名为repeatString
的变量,并且没有任何内容。具有变量myString
的唯一范围是构造函数中的范围,并且该范围无法从repeatString
访问。
JavaScript中的类与Java完全不同(here's an overview),即使语法看起来非常相似。
答案 1 :(得分:1)
要表明您引用了名为myString
的对象的属性而不是具有相同名称的变量,您的console.log()
调用应显示为:
console.log(this.myString);
答案 2 :(得分:1)
要打印myString varible,请使用console.log(this.myString);
答案 3 :(得分:1)
要访问类的变量,请使用this
。变量名。
请检查以下代码。
class MyClass {
constructor(myString) {
this.myString = myString;
}
repeatString() {
console.log(this.myString);
}
}
const myClass = new MyClass('Hello');
myClass.repeatString();
答案 4 :(得分:0)
可以使用 this.member-variable 语法访问JavaScript中的类成员变量。
解决问题的正确方法如下:
Main.js
const MyClass = require("./MyClass");
let myclass = new MyClass("my string!");
myclass.repeatString();
MyClass.js
class MyClass {
constructor(myString) {
this.myString = myString;
}
repeatString() {
console.log(this.myString);
}
}
module.exports = MyClass;