При использовании JavaScript этот парень часто сбит с толку людей. Для большинства разработчиков с опытом разработки ООП это идентификатор, который ссылается на обычные элементы в текущем объеме, но в JavaScript он кажется причудливым, потому что он не фиксирован, а изменяется по мере изменения среды выполнения. В JavaScript это всегда указывает на объект, который вызывает метод, который он находится.
Давайте приведем простой пример:
Кода -копия выглядит следующим образом:
функциональный тест () {
оповещение (это);
}
var obj = function () {
var name = 'testobj';
}
obj.objtest = test;
тест();
obj.objtest ();
Поместите этот код в HTML и запустите эту страницу, сначала вы увидите предупреждение [Object Window], а затем предупреждение.
Кода -копия выглядит следующим образом:
var obj = function () {
var name = 'testobj';
}
Сначала мы определяем метод test (), вызовут метод Alert () внутри метода для отображения этого, затем определим объект функции OBJ, добавите к нему частное имя поля и добавляем к нему статический метод objtest (), и эта функция напрямую указывает на функцию Test ().
Методы теста () и obj.objtest () называются соответственно. Первое предупреждающее окно подсказывает объект Window, а вторая подсказка - это код функции OBJ, которую мы определили. Это показывает, что значение этого отличается, когда функция тестирования выполняется дважды!
Это показывает, что когда объект, вызывающий функцию, отличается, объект, упомянутый этим ключевым словом внутри, отличается. Здесь следует отметить, что JavaScript является объектным языком. Когда наша определение переменной или функции находится в корне из тега <Script> </script>, оно фактически эквивалентно добавлению соответствующих свойств или методов в объект окна. Поэтому, когда мы используем Function Test () {} код для определения функции, он фактически эквивалентен добавлению новой функции в объект Window, а именно функцию window.test ().
Мы можем провести эксперимент:
Кода -копия выглядит следующим образом:
функциональный тест () {
оповещение (это);
}
предупреждение (тест === window.test);
Предупреждающее поле подсказывает true, что означает, что когда мы вызовут функцию Test (), он эквивалентен вызова Window.test (). Поэтому, когда мы называем функцию test (), объект, который вызывает эту функцию, на самом деле является объектом окон, это относится к объекту окна, поэтому содержание окна предупреждения, которое мы появляемся, когда предупреждает (это) [окно объекта]. Мы указываем obj.objtest = test to point obj.objtest () на test (), поэтому, когда мы называем функцию obj.objtest (), это эквивалентно вызову функции test () в obj. Так что теперь это относится к объекту OBJ, а подсказка - функция OBJ, которая является кодом, который мы видим.
Говоря об этом, это должно быть почти таким же. Возможно, приведенный выше пример слишком абстрактный, и я не могу представить, какие обстоятельства его можно использовать. Итак, давайте предположим, что требование и сделаем пример, который ближе к практичному.
Предположим, что все гиперссылки на нашей странице теперь должны быть изменены на красный после нажатия и реализовать их в JavaScript. Общая идея должна заключаться в том, чтобы получить все теги <a> на странице, а затем перевернуть все теги <a>, зарегистрировать событие Click для каждого из них, и после того, как событие запускается, мы устанавливаем его значение цвета красным.
Пример кода заключается в следующем:
Кода -копия выглядит следующим образом:
// Изменить цвет
function ChangeColor () {
this.style.color = '#f00';
}
// Инициализировать, зарегистрировать события для всех тегов
function init () {
var CustomLinks = document.GetElementsByTagName ('a');
для (i in CustomLinks) {
// Вы также можете использовать слушатель событий для регистрации событий
// Поскольку может потребовать больше кода, чтобы быть совместимым с IE, FF и другими браузерами, вы можете написать это самостоятельно
CustomLinks [i] .onclick = ChangeColor;
}
}
window.onload = init;
Добавьте этот код в документ HTML и добавьте в документ несколько гиперссылок. Когда гиперссылка нажимается, цвет станет красным. Функция ChangeColor (), которую мы определили здесь, относится к текущей гиперссылке при нажатии на гиперссылку. Если вы вызовите функцию ChangeColor () непосредственно, браузер сообщит об ошибке, и ошибка будет предложена: «Это.style» является нулевым или нет объектом или неопределенным.
Интересно, может ли это заставить вас, кто читает статью, немного понимать это ключевое слово в JavaScript? Или вы уже нетерпеливы? (: P)
На самом деле, чтобы по -настоящему более глубоко понимать эту проблему, вы должны иметь более глубокое понимание цепочки объема и цепочки сферы JavaScript.
Объем, как следует из названия, относится к пространству кода, где определенный атрибут или метод имеет права доступа. Проще говоря, это область применения этой переменной или метода в коде. Среди большинства упс, есть три сферы: государственные, частные и защищающие. Я не буду подробно объяснить здесь. Если у вас есть опыт работы в ООП, у вас должно быть глубокое понимание. Я хочу сказать здесь, что эти три типа оцелев практически бессмысленно для JavaScript, потому что в JavaScript есть только один публичный объем, в котором применение поддерживается в функциях. Например:
Кода -копия выглядит следующим образом:
var test1 = 'glable переменная';
function example () {
var test2 = 'Пример переменной';
предупреждение (тест1);
предупреждение (тест2);
}
пример();
предупреждение (тест1);
предупреждение (тест2);
Согласно тому, что мы объяснили ранее, переменная Test1 здесь эквивалентна свойству окна, поэтому она будет работать во всей области окна, в то время как Test2 объявляется внутри функции примера (), поэтому его объем поддерживается внутри метода примера (). Если браузер Test2 называется вне функции, будет вызвана ошибка. И вызов Test1 Inside Пример () в порядке.
Основываясь на этом, давайте приведем еще один пример:
Кода -копия выглядит следующим образом:
var test = 'glable переменная';
function example () {
var test = 'Пример переменной';
}
пример();
предупреждение (тест);
Что произойдет, если этот пример запустится? Да, ящик для предупреждения будет вызвать «переменную Glable», потому что область тестовой переменной внутри функции примера () поддерживается только внутри и не будет влиять на внешнюю тестовую переменную. Что если мы удалим ключевое слово var в тестовой переменной inside aser ()? Вы можете попробовать сами.
Говоря об этом, есть еще одна концепция, то есть концепция цепочки объема. Цепочка областей - это путь, который может определить значение переменной. Как видно из приведенного выше примера, ключевое слово var используется для поддержания цепочки сфера. Если переменная использует объявление ключевого слова VAR, ее можно рассматривать как конечную точку цепочки объема. Определение формальных параметров той же функции также будет играть аналогичную роль.
Говоря об этом, у вас есть более четкое понимание этого странного парня, верно? Согласно своей простой интерпретации, это всегда указывает на объект, который называет функцию, которую он находится. В соответствии с цепочкой масштабов и цепочки объема, мы четко определим истинную сторону этого. В конце, давайте сделаем простое изменение с начала примера:
Кода -копия выглядит следующим образом:
функциональный тест () {
оповещение (это);
}
var obj = function () {
var name = 'testobj';
}
obj.objtest = test;
obj.objtest2 = function () {
тест();
}
тест();
obj.objtest ();
obj.objtest2 ();
Что, по вашему мнению, подскажет? Вы можете попробовать запустить (: p);
Поскольку это изменяется в соответствии с изменением объекта, который вызывает функцию, в которой он работает, можем ли мы заставить изменение его вызывающего объекта? Ответ да. В будущих статьях мы представим эту часть контента, а также методы реализации различных типов элементов данных в JavaScript, закрытии и других концепциях.
Я написал часть своего опыта и опыта во время учебного процесса. Во -первых, я могу поделиться ими с вами, а также изучить свои собственные недостатки. Если у меня есть какие -либо вопросы по поводу письма, пожалуйста, критикуйте и дайте мне советы. Большое спасибо!