访问节点的问题?

新手小白,最近自学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赞

谢谢:pray::pray::pray:慢慢在消化了!