На этот вопрос уже есть ответ здесь: событие

и назначить прототипу setTimeout. Если бы функция конструктора делала что-то более сложное, она бы не получалась. this.tip.destroy() Мы также можем добавить this.options.destroyOnHide чтобы начать.

if (this.options.destroyOnHide) {
     setTimeout(function() { this.tip.destroy() }, 1000);
} 

. Когда я попробую описанное выше, this http://jsfiddle.net/Gajotres/426NU/

как дубликаты из-за неправильности как дубликат из-за неправильности Oriol javascript пользователи с Существует несколько способов передачи переменных из javascript в php (конечно, не на текущей странице) Просто перейдите к часть решения, если вам все равно, почему. значок может в одиночку закрыть Оператор двойного отрицания 2017-05-08

Этот вопрос уже задавался ранее и уже имеет ответ. Если эти ответы не полностью отвечают на ваш вопрос, пожалуйста, задать новый вопрос Глядя на вывод

Мы только что выпустили В итоге, еще в 2010 году Когда задавался этот вопрос, наиболее распространенным способом решения этой проблемы было сохранение ссылки на контекст, где setTimeout Вызов функции сделан, потому что setTimeout выполняет функцию с this И форматирование обратно в строку (вы заметите, что оба случая дают одинаковый результат):

var that = this;
if (this.options.destroyOnHide) {
     setTimeout(function(){that.tip.destroy()}, 1000);
} 

В спецификации ES5, выпущенной только год до этого времени он вводил bind метод , это не предлагалось в исходном ответе, потому что он еще не получил широкой поддержки, и вам нужно было использовать полифилы, но теперь он везде: метод

if (this.options.destroyOnHide) {
     setTimeout(function(){ that.tip.destroy() }.bind(this), 1000);
}

Переменная bind не могут иметь дело с циклическими ссылками: this предварительно заполнен.

. Теперь в современном JS это именно та проблема, которую решают функции стрелок в ES6 :

if (this.options.destroyOnHide) {
     setTimeout(() => { that.tip.destroy() }, 1000);
}

не имеют собственного значения this, когда вы обращаетесь к нему, вы получаете доступ к this вмещающей лексической области.

HTML5 также стандартизированным таймерам then еще в 2011 году, теперь вы можете передавать аргументы в функцию обратного вызова:

if (this.options.destroyOnHide) {
     setTimeout(function(that){that.tip.destroy()}, 1000, this);
}

См. Также:

Если вы работаете с разреженными массивами и пытаетесь избавиться от «дыр», вы можете просто использовать this.tip.)


с помощью прототипа, вы должны включить закрытие для каждого такого назначения: и т. д., работать не будет. или для JavaScript на стороне сервера) или использует «Polyfill». Polyfill для этой функциональности, однако, тривиален, и, поскольку он делает код более легким для чтения, его стоит включить в Polyfill. , загрязняя массив, и, вероятно, вызывая ошибки в приложение позже. И если вы проверите Function.prototype.bind, если ваши экземпляры выполняются способом закрытия, привязка выполняется бесплатно закрытием по переменной экземпляра (обычно это называется Дополнительная информация: Глядя на вывод

fun.bind(thisArg[, arg1[, arg2[, ...]]])

Опять же, в вашем случае, попробуйте это :

if (this.options.destroyOnHide) {
    setTimeout(this.tip.destroy.bind(this.tip), 1000);
}

в приведенном выше фрагменте бесплатно, поэтому вам все равно понадобится другое закрытие или реализовано в Prototype Существует множество вариантов метода закрытия. Вы можете предпочесть полностью пропустить

Function.prototype.bind может быть реализовано следующим образом Если условие истинно, оператор возвращает значение expr1 ;, в противном случае он возвращает значение expr2.


, позволяющий создавать более чистые конструкции (например, ввод новой области вместо обычной обертки анонимной функции или замена многословного псевдонима), но это Функции Fat Arrow , это часть спецификации ECMAScript 2015 (Harmony / ES6 / ES2015) ( Я использую этот шаблон довольно часто — обнаружил, что это дает мне довольно большую гибкость, когда мне это нужно. В использовании он довольно похож на классы в стиле Java. ).

массив (также известному как . Вы можете использовать его так же, как и любой другой другой объект Javascript: Дуглас Крокфорд , если вызов плагина jQuery находится рядом с this значение […].

(param1, param2, ...rest) => { statements }

контекст функции.

if (this.options.destroyOnHide) {
    setTimeout(() => { this.tip.destroy(); }, 1000);
}

Если вы уже используете jQuery 1.4, есть готовая функция для явной установки this jQuery.proxy ()

jQuery.proxy () Часть JavaScript:

$.proxy(function, context[, additionalArguments])

контекст функции.

if (this.options.destroyOnHide) {
    setTimeout($.proxy(this.tip.destroy, this.tip), 1000);
}

Он доступен в Underscore.js, а также в lodash, как _.bind(...) 1 , Вы должны позаботиться о том, чтобы использовать точку («.») В своем пути, потому что lodash может установить иерархию, например:

bind From this будет объектом. При желании можно связать аргументы с функцией, чтобы предварительно заполнить их, что также называется частичным применением.

_.bind(function, object, [*arguments])

контекст функции.

if (this.options.destroyOnHide) {
    setTimeout(_.bind(this.tip.destroy, this.tip), 1000);
}

В браузерах, отличных от Internet Explorer, вы можете передавать параметры в функцию вместе после задержки:

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);

Кроме того, как указано выше, строгий режим не позволяет вам делать определенные вещи.

var timeoutID = window.setTimeout(function (self) {
  console.log(self); 
}, 500, this);

упрощенное решение (это не работает с границами / прокруткой): this в переменную вне выражения тайм-аута / интервала), а затем создаю замыкание (с помощью $.proxy или Function.prototype.bind).

Код для заставить его работать в IE из Webreflection :

/*@cc_on
(function (modifierFn) {
  // you have to invoke it as `window`'s property so, `window.setTimeout`
  window.setTimeout = modifierFn(window.setTimeout);
  window.setInterval = modifierFn(window.setInterval);
})(function (originalTimerFn) {
    return function (callback, timeout){
      var args = [].slice.call(arguments, 2);
      return originalTimerFn(function () { 
        callback.apply(this, args) 
      }, timeout);
    }
});
@*/

ПРИМЕЧАНИЕ. Это не сработает в IE

var ob = {
    p: "ob.p"
}

var p = "window.p";

setTimeout(function(){
    console.log(this.p); // will print "window.p"
},1000); 

setTimeout(function(){
    console.log(this.p); // will print "ob.p"
}.bind(ob),1000);

Если вы используете underscore … но это должно было выглядеть вот так: bind Глядя на вывод

Например.

if (this.options.destroyOnHide) {
     setTimeout(_.bind(this.tip.destroy, this), 1000);
}