CUG*_*een 6 javascript rollup node.js electron
我是node.js的新手,并且我想要求一个类。我已经使用https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes作为参考。但是,例如,当我这样做时:
// talker.js
class Talker {
talk(msg) {
console.log(this.say(msg))
var t = setTimeout(this.talk, 5000, 'hello again');
}
say(msg) {
return msg
}
}
export default Talker
// app.js
import Talker from './taker.js'
const talker = new Talker()
talker.talk('hello')
Run Code Online (Sandbox Code Playgroud)
我得到:
talker.js:4未捕获的TypeError:this.say不是函数
应该说app.js是electronic.js渲染器进程,并且使用rollup.js捆绑在一起
任何想法为什么会这样?
更新:对不起,我在输入伪代码时忘记添加一行。当我setTimeout使用回调调用时,它实际上发生了。我已经更新了代码。
您正在失去方法的束缚this。
从此更改:
setTimeout(this.talk, 5000, 'hello again');
Run Code Online (Sandbox Code Playgroud)
对此:
setTimeout(this.talk.bind(this), 5000, 'hello again');
Run Code Online (Sandbox Code Playgroud)
当您this.talk作为函数参数传递时,它将接受this并查找方法,talk并传递对该函数的引用。但是,它仅传递对该函数的引用。与您所拥有的对象不再有任何关联this。 .bind()允许您传递对微小存根函数的引用,该存根函数将跟踪this并以方式调用您的方法this.say(),而不仅仅是say()。
如果您只是这样做,则可以看到相同的内容:
const talker = new Talker();'
const fn = talker.say;
fn();
Run Code Online (Sandbox Code Playgroud)
这将产生相同的问题,因为将方法分配给不fn带任何关联talker。它只是一个函数引用,与对象没有任何关联。事实上:
talker.say === Talker.prototype.say
Run Code Online (Sandbox Code Playgroud)
什么.bind()是创建一个小的存根函数,该存根函数将保存对象值,然后使用该对象调用您的方法。
| 归档时间: |
|
| 查看次数: |
6123 次 |
| 最近记录: |