Доступ к свойству внутри метода.
Здравствуйте.
Вопрос: что я не так делаю? Кусочек кода, содержащий только значимое для вопроса: 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), то в консоли пишется: Код:
d console.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, время: 09:05. |