gpt4 book ai didi

javascript - this.set 不是一个函数

转载 作者:行者123 更新时间:2023-11-28 00:11:33 24 4
gpt4 key购买 nike

我有这样的代码:

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 是解决此问题的唯一方法吗?

最佳答案

ws2812.speec 被定义为静态函数。因此,其中的 this 关键字引用其自身(函数作用域),而不是您想要的对象 ws2812

要解决此问题,可以进行以下任一快速选择:

<小时/>

Choice#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 > 转换为原型(prototype)函数

这样您就可以保留 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
<小时/>

Choice#3 > 调用时绑定(bind)“this”对象

如果您坚持不想修改此 ws2812 的实现。可以保留它并在使用它时绑定(bind)该对象。

所以当你调用ws2812.speech时,你需要使用function.prototype.call并传入ws2812.set

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

但是,这看起来没有太多语义,并且可能会给维护此代码的人员在将来的使用中造成困惑。

<小时/>

我将让您决定哪种方式最适合您。

关于javascript - this.set 不是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30832039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com