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)

正在取代thisws2812解决这个问题的唯一办法吗?

TaoPR

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TypeError:this。$ set不是一个函数

来自分类Dev

TypeError:jQuery(...)。on不是一个函数

来自分类Dev

ReactDnD:connectDragSource不是一个函数

来自分类Dev

TypeError:require(...)不是一个函数

来自分类Dev

this.getAttribute不是一个函数

来自分类Dev

TypeError:$(...)。datepicker不是一个函数

来自分类Dev

this.url不是一个函数

来自分类Dev

TypeError:* .getMonth不是一个函数

来自分类Dev

this.setState不是一个函数

来自分类Dev

TypeError:func(...)。then不是一个函数

来自分类Dev

反应typerror,不是一个函数

来自分类Dev

TypeError:$(...)。dialog不是一个函数

来自分类Dev

TypeError:$(...)。datepicker不是一个函数

来自分类Dev

jqBootstrapValidation不是一个函数

来自分类Dev

TypeError:$(...)。visualize不是一个函数

来自分类Dev

'find()`undefined不是一个函数

来自分类Dev

this.getAttribute不是一个函数

来自分类Dev

JSNI:undefiend不是一个函数

来自分类Dev

TypeError:require(...)不是一个函数

来自分类Dev

this.hasErrors不是一个函数

来自分类Dev

TypeError:$ .mainBowerFiles不是一个函数

来自分类Dev

findAll不是一个函数

来自分类Dev

Sequelize 创建不是一个函数?

来自分类Dev

toFixed 不是一个函数

来自分类Dev

Dispatch 不是一个函数 react

来自分类Dev

获取/设置不是一个函数?

来自分类Dev

app.set,然后出现TypeError:app.get不是一个函数

来自分类Dev

React Native Set State 不是一个函数,在每个循环中不确定绑定?

来自分类Dev

两个对象,一个“不是函数”