2015-06-14 130 views
1

我有这样的代码:this.set不是函数

var ws2812 = {}; 


ws2812.set = function(r,g,b){ 
    $.get("/light?r="+r+"&g="+g+"&b="+b, function(data) { 
     console.log("Light set to:"+"/light?r="+r+"&g="+g+"&b="+b); 
    }) 
}; 

ws2812.speech = function(word){ 
    switch(word){ 
     case "czerwone": 
      this.set(255,0,0); 
     break; 
     case "zielone": 
      this.set(0,255,0); 
      break; 
     case "niebieskie": 
      this.set(0,0,255); 
      break; 
     case "białe": 
      this.set(255,255,255); 
      break; 
     default: 
      this.set(0,0,0); 
      break; 

    } 
} 

当运行ws2812.speech("");内控制台,一切正常。然而,当与Annyang库配对时,我得到这个:

Uncaught TypeError: this.set is not a function 
ws2812.speech @ script.js:29 
b.annyang.init.d.onresult @ annyang.min.js:6 

怎么了?

[编辑]

该命令被加入这样的:

annyang.addCommands({"ustaw *term światło":ws2812.speech}); 

具体而言,内部annyang,这条线将失败:

f[h].callback.apply(this,m) 

ws2812只有这样,才能更换this解决这个问题?

+1

您是否将未绑定的'speech'函数作为回调函数传递?请在您的示例中包含*失败的代码。 – zzzzBov

回答

1

ws2812.speec被定义为静态函数。所以this里面的关键字是指它自己(功能范围),而不是你想要的对象ws2812

要解决它,无论这些快速的选择,可制成:


选择#1>调用静态函数ws2812.set正确

所以,你的代码就变成了:

ws2812.speech = function(word){ 
    switch(word){ 
    case "czerwone": 
     ws2812.set(255,0,0); 
    break; 
    case "zielone": 
     ws2812.set(0,255,0); 
     break; 
    case "niebieskie": 
     ws2812.set(0,0,255); 
     break; 
    case "białe": 
     ws2812.set(255,255,255); 
     break; 
    default: 
     ws2812.set(0,0,0); 
     break; 

    } 
} 

但是,有一些可能性,this关键字在其余部分鳕鱼其他部分引用e也可能遭受这个问题。你可能需要去检查它。


选择#2>转换为原型的功能

这样你就可以保留this关键字,但功能不再是静态的。您需要实例化一个实例对象ws2812以供使用。

所以,你的声明变成:

var ws2812 = function(){}; 


ws2812.prototype.set = function(r,g,b){ 
    $.get("/light?r="+r+"&g="+g+"&b="+b, function(data) { 
     console.log("Light set to:"+"/light?r="+r+"&g="+g+"&b="+b); 
    }) 
}; 

ws2812.prototype.speech = function(word){ 
    switch(word){ 
    case "czerwone": 
     this.set(255,0,0); 
    break; 
    case "zielone": 
     this.set(0,255,0); 
     break; 
    case "niebieskie": 
     this.set(0,0,255); 
     break; 
    case "białe": 
     this.set(255,255,255); 
     break; 
    default: 
     this.set(0,0,0); 
     break; 

    } 
} 

然后通过对象的实例,而不是使用它:

var myWs2812 = new ws2812(); 
myWs2812.speech('hello world!'); // inside it, should call this.set properly 

选择#3>绑定 '这个' 对象调用

如果你坚持你不想修改执行程序这个ws2812。可以离开它并且绑定这个对象时使用它,而不是

因此,当您拨打ws2812.speech时,您需要使用function.prototype.call并传入ws2812.set

ws2812.call(ws2812.set, 'hello world!'); 

然而,这看起来并不语义,它可能会导致在以后的使用混乱的人谁都会保持这种代码。


我会留给你决定哪个是你最好的选择。