2013-04-08 4 views
-1
var myObj = { 
    name:"mike", 
    go:function(){ 
     console.log(this.name); 
    } 

} 

myObj.go() //logs out mike 
setTimeout(this.myObj.go,200) //logs out (emptyString) 
+0

@adeneo Указатель 'this' не будет установлен таким образом (ну, он будет ссылаться на глобальный объект в нестрогом режиме). –

+0

Возможный дубликат [Пропустить правильный «этот» контекст для вызова обратного вызоваTTimeout?] (Http://stackoverflow.com/questions/2130241/pass-correct-this-context-to-settimeout-callback) –

+0

@adeneo Совершенно неправильно. –

ответ

1

Определить переменную ВЕ объекта перед:

var _this = this; 
setTimeout(function() {_this.myObj.go();}, 200); 
+1

Это наиболее полный код решения, хотя OP, похоже, использует 'this' для ссылки на глобальный контекст, иначе переменная, объявленная через' var', вряд ли будет привязана к свойству объекта. –

+1

@ FabrícioMatté Да, странная часть - это то, почему они ссылаются на это с помощью 'this', когда объявляют его с помощью' var'. Я думаю, этот метод был бы необходим, если бы «это» было чем-то специфичным для контекста и было необходимо. – Ian

+0

@Ian Точно. '=]' Готовые ответы на чтение, время, чтобы потратить некоторые обороты. –

1

несколькими способами:

setTimeout(this.myObj.go.bind(this.myObj), 200); 

или

var that = this; 
setTimeout(function() { 
    that.myObj.go(); 
}, 200); 

Обратите внимание, что .bind не поддерживается в старых браузерах, поэтому для его поддержки может потребоваться полипол. Вот некоторая информация о методе: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind

+0

Обратите внимание, что '.bind' был введен в ES5, поэтому для поддержки старых браузеров следует либо использовать вашу версию с помощью обертки функций, либо [' .bind' shim] (https://developer.mozilla.org/en- США/документы/JavaScript/Справочник/Global_Objects/Функция/связывающийся # Совместимость). –

+0

@ FabrícioMatté Да, спасибо, что указали это - я не чувствовал себя вынужденным, чтобы включить это :) Мне интересно, когда настанет время, когда мы перестанем указывать, когда старые браузеры не поддерживают определенные методы. Наверное, никогда, поскольку люди будут использовать старый IE навсегда ... – Ian

+0

Ну, думаю, я один из немногих, кто по-прежнему проводит бессонные ночи, исправляя мою страницу HTML5, чтобы отбросить IE6 (да, действительно), но хорошо, я считаю, t много использовать в поддержке IE <8, поэтому я медленно мигрирую и удаляю старые IE-хаки. Ни один из нас не хочет ограничивать себя использованием расширенных функций HTML5/CSS3 только из-за старого IE, поэтому моя методология теперь заключается в том, чтобы применять грамотную деградацию вплоть до верхних частей IE8. И да, IE8 не поддерживает '.bind()', и это создаст уродливое выполнение скрипта с ошибкой JS. ': P' –

1
var myObj = { 
    name:"mike", 
    go:function(){ 
     console.log(this.name); 
    } 

} 

setTimeout(function(){myObj.go()},200) 
+0

Я избил вас до редактирования: P http://stackoverflow.com/posts/15889184/revisions – Doorknob

+0

Ага, я видел это: P –

1

Попробуйте

var myObj = { 
    name:"mike", 
    go:function(){ 
     console.log(this.name); 
    } 

} 

myObj.go(); //logs out mike 
setTimeout(function(){ 
    myObj.go(); //logs out mike too 
},200); 
0

Ваш код правильный минус несколько вещей.

setTimeout(this.myObj.go,200) 

Должно быть

setTimeout(function() {myObj.go()},200) 

Это было не определено, потому что this.myObj не было в рамках SetTimeout и не было завернутые в анонимной функции или переменной функции. Вы были на правильном пути, хотя!

Смежные вопросы