2015-09-20 4 views
0

Я попытаюсь объяснить это лучшее, что я могу, начав с краткого резюме моего понимания областей, которые имеют отношение к моей проблеме:Что означает ключевое слово «this», когда внутри закрытия метода JavaScript?

Метод: метод является JS, когда функция является свойством объекта, когда этот используется в рамках метода, который относится к объекту, который является свойством функции.

Функция: этот используется в функции, которая не является свойством объекта, связано с глобальным объектом (в HTML-страницу, это будет объект окна).

Закрытие: это из внутренней функции метода относится к глобальному объекту также. Это может быть исправлено путем «, что этот =» в методе и использовании , что вместо это в замыкании.

В следующем примере, который я видел в Дуглас Crockfords «JavaScript - The Good Parts», кажется, разрушить мое нынешнее понимание того, как это должно работать внутри закрытия:

String.method('deentityify', function(){ 
      var entity = { 
       quot: '"', 
       lt: '<', 
       gt: '>' 
      }; 

     return function(){ 
       return this.replace(/&([^&;]+);/g, 
        function(a,b){ 
         var r = entity[b]; 
         return typeof r === 'string' ? r : a; 
        } 
     }; 
}()); 


//Just for reference 
Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

это называют в закрытии метода deentityify относится к строковому объекту, на котором выполняется этот метод. Это не имеет для меня никакого смысла? Я думал, что этот здесь должен ссылаться на глобальный объект.

+0

О, у меня есть это сейчас ... Закрытие возвращается как метод deentityify, – raah

+0

Вы не можете просто принять значение 'this', проанализировав определение функции. Например, 'var fn = String.deentityfy; п(); // это === окно'. Это то, как вы называете свою функцию и как вы ее связываете. – MinusFour

+0

Да, я понимаю, что я не включал в этот вопрос и в ретроспективе должен был контекст исполнения ... на самом деле я описал контекст выполнения в конце вопроса «... строковый объект, на котором этот метод выполняется на « – raah

ответ

3

Если мы пишем это без хорошей обзорного (т.е. с использованием некрасивых глобальных переменных) и вяжущие метод методы, вы получите:

var entity = { 
    quot: '"', 
    lt: '<', 
    gt: '>' 
}; 

String.prototype.deentityify = function(){ 
    return this.replace(/&([^&;]+);/g, 
    function(a,b){ 
     var r = entity[b]; 
     return typeof r === 'string' ? r : a; 
    } 
); 
}; 

var s = "&lt;".deentityify(); 

Так, deentityify это просто метод на String объекта. Когда вы вызываете метод с использованием точечного синтаксиса, контекст метода - это строка, которую вы вызываете.

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