我在JavaScript中创建了一个类,如下所示:
this.state.inputs
应该在类Trie中调用class TreeMatching
{
constructor()
{
this.thresholdPoints=0;
this.neighborWeight = 0.4;
this.totalFrequency = 0.0;
this.listSeq = [];
this.listFreq = [];
this.mapScore = new Object();
this.tree = new Trie();
}
createTree()
{
var list_Dictionary;
var loadWordList = $.get("../wordFrequencyTop5000.txt", function(data)
{
list_Dictionary = data.split("\n");
});
loadWordList.done(function()
{
for(var i=0;i<list_Dictionary.length;i++)
{
var string = list_Dictionary[i];
this.tree.insert(string); //<-- Cannot read property 'insert' of undefined
}
});
}
}
方法,如下所示:
insert
但是,标记错误的代码行(外部函数的此值)没有属性class Trie
{
constructor()
{
this.count=1;
this.root = new TrieNode();
}
insert(word)
{
var children = new Object();
for(var i=0; i<word.length(); i++){
var c = word.charAt(i);
var t;
if(children[c]){
t = children[c];
}else{
t = new TrieNode(c);
children.put(c, t);
}
children = t.children;
//set leaf node
if(i==word.length()-1)
t.isLeaf = true;
}
}
}
,tree
等。
有没有办法可以从内部回调函数中访问这些值?
由于
答案 0 :(得分:1)
look at 'this' - 你必须定义局部变量来维持对#34;这个&#34;在通话中,如链接中所述。
createTree()
{
var self = this;
var list_Dictionary;
var loadWordList = $.get("../wordFrequencyTop5000.txt", function(data)
{
list_Dictionary = data.split("\n");
});
loadWordList.done(function()
{
for(var i=0;i<list_Dictionary.length;i++)
{
var string = list_Dictionary[i];
self.tree.insert(string); //<-- Now you should be able to do it
}
});
}
答案 1 :(得分:0)
&#39;这&#39;内在的匿名者有不同的范围。尝试利用JS中更接近的优势来访问函数调用范围。
var that = this;
loadWordList.done(function() {
for(var i=0;i<list_Dictionary.length;i++)
{
var string = list_Dictionary[i];
that.tree.insert(string); // 'that' will hold 'this' in the right scope
}
});
答案 2 :(得分:0)
loadWordlist.done中的匿名函数创建一个带有新上下文的新范围。
如果您想保留旧的上下文,可以使用ES2015箭头功能:
loadWordList.done(() => {
//code here
);
或在createTree()中创建一个var:
var that = this;
然后在loadWordList回调中你可以使用:
来引用正确的上下文that.tree.insert(string);
我个人更喜欢箭头功能,因为&#39;那个&#39; var名称是一个糟糕的选择。因为您使用ES2015类浏览器支持不一定是个问题。