Javascript类变量范围变为未定义

时间:2016-10-19 00:54:46

标签: javascript class

所以我有一个班级名Session

我声明为:

function Session() {
}

我有一个名为Session.prototype.parseCommand(){}的函数。

出于某种原因,如果我将该函数称为:this.parseCommand(),则将其声明为未声明。

这也适用于以下功能:this.textInput = false。在某些功能上,我可以调用它,但在其他功能上它是未定义的。

有什么问题?

function Session() {
    this.textInput = null;
    this.lineGutter = null;
}
Session.prototype.parseCommand = function(command) {
    if (command === 'clear') {

    } else {
        var line = document.createElement('div');
        line.className = 'line';
        line.setAttribute('id', 'line command');
        line.innerHTML = command;
        document.getElementById('sessionLineGutter').appendChild(line);
    }
};
Session.prototype.textInputKey = function(e) {
    if (e.keyCode === 13) {
        this.parseCommand(document.getElementById('sessionText').innerHTML);
        e.preventDefault();
    }
};

这是完整的代码和错误。我还注意到我无法使用this.lineGutter.appendChild(line);,而是必须使用document.getElementById('sessionLineGutter').appendChild(line)。这是为什么?

谢谢,

1 个答案:

答案 0 :(得分:1)

当在原型上声明任何方法时,你无法使用它来调用它们 它必须直接通过对象

调用

let words = ["hello", "world!!"]
var res: [String] = []
for word in words {
    res += word.components(separatedBy: .punctuationCharacters).filter{!$0.isEmpty}
    res += word.components(separatedBy: CharacterSet.punctuationCharacters.inverted).filter{!$0.isEmpty}.joined().characters.map{String($0)}
}
print(res)   // ["hello", "world", "!", "!"]

这里指的是窗口(全局)对象

在此代码段中

function session(){
  }
session.prototype.method1=function(){
  alert("here");
  }
var sess1=new session();
sess1.method1();
//this -here refers to window object

这指的是全局(窗口)对象

你可以使用调用parsecommand方法 var session1 = new Session(),可以调用session1.parseCommand 现在在parseCommand中,这将是Session对象,所以这就是你试图访问时的原因 this.lineGutter.appendChild(线);

这不会发生,因为这里它指向Session对象中的lineGutter,但我猜你期望它附加到这里没有发生的身体,因为这是一个对象

这就是你必须document.getElementById('sessionLineGutter')。appendChild(line)

的原因

我希望你明白