新手小白,最近自学creator,遇到个问题,烦请大大解答!
cocos creator v 1.9.0
代码如下:
onLoad () {
cc.log(this.node.name)
this.node.on(cc.Node.EventType.TOUCH_START, function (event){
cc.log(this.node.name)
}, this.node);
},
模拟器场景载入后,第一个node.name正常log,当点击该节点时,第二个log报错,“Simulator: E/jswrapper (267): ERROR: Uncaught TypeError: Cannot read property ‘name’ of undefined, location: assets/script/san1.js:0:0
”
为什么会这样呢?
this指向问题,这样写
onLoad () {
var self = this;
cc.log(this.node.name)
this.node.on(cc.Node.EventType.TOUCH_START, function (event){
cc.log(self.node.name)
}, this.node);
},
1赞
谢谢大佬!!已解决!!是否理解为第二个this指代的是this.node.on,所以要用self把this存起来?

我给你分析下
cc.log里面的this,在你的写法中指的是this.node
所以cc.log里面的 this.node.name 相等于写在外部的 this.node.node.name
this.node.node 是 undefined, 总结起来就是
this.node.node.name --> undefined.name --> 报Cannot read property ‘name’ of undefined
有三种写法,不过最好写前两种
一:外部声明self指向this,在方法内部调用self(就是二楼的方法)
二:不在外部声明,查看现在的on参数target传入的是什么
如传入的是this,那么方法内部的this就是指外部的this,即

如传入的是this.node,那么方法内部的this就是指外部的this.node, 即

三: 在function后面bind(this),末尾的参数不传,那么function内部的this就是外部的this

第三种方法不赞成的原因是off的时候有问题,因为bind时copy了一份,所以on,off抵消后还保留了一份copy的,会导致出问题,没取消掉监听
4赞
谢谢

慢慢在消化了!