Доступ к свойству внутри метода.
Здравствуйте.
Вопрос: что я не так делаю? Кусочек кода, содержащий только значимое для вопроса:
var Paradise = {
state: "inactive",
paradiseLost: function(){
function AddActiveMarker(index,obj){
console.log(obj.state)
}
AddActiveMarker(0,this)
}
}
свойство state успешно меняется другой функцией. Значение этого свойства нужно использовать в функции AddActiveMarker(). Внутри функции paradiseLost() это свойство читается нормально, но во вложенную функцию передать не могу, получаю undefined. Где чего недопонимаю? Заранее спасибо. |
var Paradise = {
state: "inactive",
paradiseLost: function(){
function AddActiveMarker(index,obj){
alert(obj.state)
}
AddActiveMarker(0,this)
}
}
Paradise.state=90;
Paradise.paradiseLost()//90
|
bot87, спасибо за ответ.
То есть, код корректен и всё должно работать? Тем не менее у меня сейчас в консоль валится вот такая ошибка: Uncaught TypeError: Cannot read property 'state' of undefined. Может быть в мою выдержку из кода не попало что-то существенное. Только учусь, ещё могу даже не понимать, где может быть ошибка. Вот код объекта полностью:
var Paradise = Backbone.View.extend({
el: $("#paradise"),
model: appState,
state: "inactive",
animateDuration: 400,
animateDelay: 400,
initialize: function(){
this.model.bind('change:frame', this.onFrameChange, this)
},
onFrameChange: function(){
var cFrame = this.model.get("frame")
switch (true) {
case (cFrame>15 && cFrame<25):
var ff = (25-cFrame)/20*Math.PI
$(this.el).css({opacity:Math.cos(ff)}).show()
break
case(cFrame>48 && cFrame<56):
var ff = (cFrame-48)/16*Math.PI
$(this.el).css({opacity:Math.cos(ff)}).show()
break
case(cFrame>=25 && cFrame<=48):
$(this.el).css({opacity:1}).show()
if(cFrame>=30 && this.state=="inactive"){
this.state="boom"
this.paradiseBoom()
}else if(cFrame<30 && this.state=="boom"){
this.paradiseLost()
this.state="inactive"
}
break
default:
$(this.el).hide()
this.paradiseLost()
this.state="inactive"
}
},
paradiseBoom: function(){
var $happiness = $(this.el).children("li")
var animateDuration = this.animateDuration
var animateDelay = this.animateDelay
function AddActiveMarker(index,obj){
var $cHappiness = $happiness.eq(index)
if($cHappiness.size()==1){
$("#eden").show()
switch(index){
case 0:
$("#tree")
.css({opacity:0,display:"block"})
.animate({opacity:1},{duration:animateDuration})
break
case 1:
$("#mrpostman")
.css({opacity:0,display:"block"})
.animate({opacity:1},{duration:animateDuration})
break
case 2:
$("#bench")
.css({opacity:0,display:"block"})
.animate({opacity:1},{duration:animateDuration})
break
}
$("<span class=activemarker />")
.css({opacity:0})
.appendTo($cHappiness).animate({opacity:1},{duration:animateDuration,complete:function(){
if(obj.state=="boom") setTimeout(function(){AddActiveMarker(index+1,obj)},animateDelay)
}})
}
}
AddActiveMarker(0,this)
},
paradiseLost: function(){
$(this.el).children("li").children("span.activemarker").remove()
$("#eden").animate({opacity:0},{duration:400,complete:function(){
$(this).hide().css({opacity:1})
$("#eden>*").hide()
}})
}
})
var paradise = new Paradise()
В консоли ошибка указывает на эту строку: if(obj.state=="boom") setTimeout(function(){AddActiveMarker(index+1,obj) },animateDelay) |
Цитата:
this становится window - если вкратце. |
LittlePony, для начала вам надо понять:
1. что такое this (если уж совсем по простому), 2. как передавать нужный вам this
var Paradise = {
state: "inactive",
paradiseLost: method
};
function method() {
alert( this === Paradise );
}
Paradise.paradiseLost(); // true
method.call( Paradise ) // true
|
Цитата:
Однако нет, this не становится window. Если сделать console.log(this), то в консоли пишется: Код:
dconsole.log(obj), то в консоли пишется: Код:
Uncaught TypeError: Cannot read property 'state' of undefined init.js:219 |
Цитата:
AddActiveMarker.call( Paradise, 0, Paradise ); |
Цитата:
А ещё мне бы хотелось не только добиться работоспособности, но и понять, как это всё работает. Так вот, если я правильно понимаю, то между записями AddActiveMarker.call( Paradise, 0, Paradise );и AddActiveMarker( 0, Paradise );разница только та, что в первом случае мы явно указываем, что будет скрываться под this внутри этой функции при таком вызове. Но нигде внутри этой функции this не используется. Тогда в чём смысл такой замены? |
Цитата:
Сейчас еще раз посмотрел твой код. Як у тебя там все наворочено и точек с запятыми не хватает ) Смотри, если проблема здесь, AddActiveMarker(0,this) ищи, что такое этот this и откуда он передается Еще есть "секретный" способ сделать правильный this
function Constructor() {
var self = this;
self.method = function() { };
}
var cat = new Constructor();
вроде твой случай |
Цитата:
Цитата:
Но если даже сразу в этой функции первой строкой поставить вывод того, что в неё передалось, то выводится совершенно неожиданный результат. Цитата:
|
| Часовой пояс GMT +3, время: 10:24. |