内部函数变量失去外部函数的“this”值

时间:2016-11-23 22:10:51

标签: javascript jquery variables

我在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等。

有没有办法可以从内部回调函数中访问这些值?

由于

3 个答案:

答案 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类浏览器支持不一定是个问题。