我有这样的代码:
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)
正在取代this
以ws2812
解决这个问题的唯一办法吗?
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
下,代码其余部分中引用的关键字也可能会遇到此问题。您可能需要检查一下。
Choice#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;
}
}
然后通过object实例使用它:
var myWs2812 = new ws2812();
myWs2812.speech('hello world!'); // inside it, should call this.set properly
选择#3>调用时绑定“ this”对象
如果您坚持不想修改this的实现ws2812
。可以保留它并在使用它时绑定该对象。
因此,当您致电时ws2812.speech
,您需要像这样使用function.prototype.call
和传递ws2812.set
。
ws2812.call( ws2812.set, 'hello world!' );
但是,这看起来并没有太多语义,并且可能会给将来维护此代码的人员造成混乱。
我会留给您决定哪种方式是您最好的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句