Локальные переменные функции
В функцию могут входить и локальные переменные (объявляются через var). Они видны только внутри функции:
function showMessage() { var message = 'Привет, моё имя — Петя!'; // это локальная переменная alert( message ); } showMessage(); // 'Привет, моё имя — Петя!' alert( message ); // <-- здесь ошибка, ведь переменная видна только внутри функции
Помните, что блоки while, switch, for, if/else, do..while никак не влияют на зону видимости переменных, то есть при объявлении переменных в данных блоках они будут видны во всей функции. Пример:
function count() { // переменные i и j не будут удалены по окончании цикла for (var i = ; i < 3; i++) { var j = i * 2; } alert( i ); // i=3, последнее значение i, цикл при нём перестал работать alert( j ); // j=4, последнее значение j, которое цикл вычислил }
При этом неважно, где конкретно в function вы объявляете переменную. Вне зависимости от метода ваших действий объявление сработает одни раз и распространится на всю функцию:
function count() { var i, j; // здесь мы передвинули объявление var в начало for (i = ; i < 3; i++) { j = i * 2; } alert( i ); // i=3 alert( j ); // j=4 }
Еще несколько материалов для чтения
- Использование XMLHttpRequest — MDN
- Справочник по объекту XMLHttpRequest — MDN
- Как мне вернуть ответ от асинхронного вызова?
Плюсы
Быстро — операции DOM часто бывают быстрыми, и вы можете относительно быстро хранить и получать доступ к большому количеству данных.
Минусы
- Потенциально несемантическая разметка — обычно происходит то, что вы используете какой-то вид для хранения информации, потому что информацию легче получить , но это означает, что у вас есть бессмысленный элемент в вашем HTML. HTML имеет элемент для данных о документе, а HTML 5 вводит атрибуты для данных, специально предназначенных для чтения с помощью JavaScript, которые могут быть связаны с определенными элементами.
- Загрязняет источник — данные, которые генерирует PHP, выводятся непосредственно в источник HTML, а это означает, что вы получаете более крупный и менее сфокусированный источник HTML.
- Сложнее получить структурированные данные — структурированные данные должны быть действительным HTML, иначе вам придется экранировать и преобразовывать строки самостоятельно.
- Тесно связывает PHP с вашей логикой данных — поскольку PHP используется в презентации, вы не можете четко разделить их.
Строковые операции
Допустим, есть две переменные со строковыми значениями. Например, одна будет содержать слово ‘ша’ а другая ‘рик’. Мы хотим объединить эти слова, чтобы получилось слово ‘шарик’. Для этого воспользуемся операцией сложения.
var slog_1 = "ша"; var slog_2 = "рик"; var word = slog_1 + slog_2; document.write(word); //Результат: шарик
Теперь обратим внимание на такой случай. Мы знаем, что в переменной можно записать и числа и строки, но также можно записать и строковые числа (например var = «64» )
Допустим, у нас есть две таких переменных со строковыми числами и нам нужно сложить эти числа.
Если мы просто воспользуемся операцией сложения, то получим неправильный результат, так как числа объединятся, а не сложится.
var x = "78"; var y = "90"; document.write("result = "+ (x + y));//Результат: result = 7890
Поэтому перед тем как сделать какую-то операцию со строковыми числами необходимо сначала их преобразовать из строки в число. Делается это с помощью функции Number().
var x = "78"; var y = "90"; x = Number(x); y = Number(y); document.write("result = "+ (x + y));//Результат: result = 168
Ссылки в JS
В заключении поговорим о ссылке в JavaScript. Под ссылкой будем понимать видимую часть текста или кода, нажатие на которую приведёт к переходу по ней. Рассмотрим три основных метода, в результате применения которых образуется кликабельная ссылка.
Самый простой метод, позволяющий осуществлять вызов — вывод alert в ссылке. Пример такой ссылки (ссылку можно запустить без проблем из любого браузера):
<a href = "javascript:alert('Привет Мир!');">Вызов ссылки</a>
Второй метод вызова ссылки имеет более сложную конструкцию. В этом случае ссылку можно сделать с помощью функции document.write(). А оформить такую ссылку можно следующим образом:
<script type="text/javascript">document.write('<a href="http://otus.ru/">текст ссылки</a>');</script>
В качестве третьего метода продемонстрируем ещё более усложнённый вариант. Ссылка и её вызов осуществляются с помощью переменных, т. к. сама ссылка и её текст выведены в отдельные переменные:
<script type="text/javascript"> desiredText = desiredLink = 'http://otus.ru/'; document.write('<a href="'+desiredLink+'">'+desiredText+'</a>'); </script>
Кроме того, можно вызывать ссылку через таблицу, div, ячейку таблицы и путём использования другого метода. Собственно говоря, использование этих методов для передачи ссылок — довольно странное занятие, если вспомнить, что у нас есть простые, эффективные и всем понятные решения с html и php.
Произвольные неизменяемые классы
Вообще, вы можете писать собственные неизменяемые сущности, применяя некоторые простые и хитрые техники на PHP. Мы не будем предъявлять слишком больших требований к данным, чтобы следовать примерам в статье было проще. Для иллюстрации я воспользуюсь профессиональными скейтбордистами и трюками, которые они привнесли в мир.
В качестве первого примера вот простой неизменяемый класс, который принимает значения в качестве параметров конструктора. Я назвал этот класс Immutable , но, возможно, это плохая идея, так как, может, это слово когда-нибудь станет ключевым в языке. Сейчас, вообще, нет никакой разницы, какое имя мы присвоим этому классу.
class Immutable { private $skater, $trick; public function __construct($skater, $trick) { $this->skater = $skater; $this->trick = $trick; } public function getSkater() { return $this->skater; } public function getTrick() { return $this->trick; } }
Используя здесь приватные свойства класса, мы гарантировали, что значения не смогут быть изменены кодом вне определения класса Immutable .
$x = new Immutable('Hawk', 'Frontside 540'); echo $x->skater = 'Mullen'; // Fatal error: Cannot access private property Immutable::$skater
Чтобы обеспечить внешний доступ к значениям, привязанным к объекту Immutable, можно просто написать открытый (public ) метод, который возвращает требуемое значение. В нашем примере есть два свойства класса, к которым мы хотели бы иметь доступ, так что я добавил getSkater() , чтоб получать имя скейтбордиста, и getTrick() , чтоб получать название трюка, который он придумал.
Это даст нам очень простой неизменяемый класс, который уже не сможет быть изменен извне после инициализации.
Локальные переменные
Переменная, объявленная внутри функции, называется локальной. Локальная переменная доступна в любом месте внутри тела функции, в которой она была объявлена. Локальная переменная создаётся каждый раз заново при вызове функции и уничтожается при выходе из неё (при завершении работы функции):
function foo() { var num = 5; console.log(num); } foo(); // 5 console.log(typeof num); // undefined
Локальная переменная имеет преимущество перед глобальной переменной с тем же именем, это означает, что внутри функции будет использоваться локальная переменная, а не глобальная:
var x = "глобальная"; // Глобальная переменная function checkscope() { var x = "локальная"; // Локальная переменная с тем же именем, что и у глобальной document.write(x); // Используется локальная переменная, а не глобальная } checkscope(); // => "локальная"
Попробовать »
Как переменную из javascript передать в php
В отличие от PHP, скрипты JavaScript выполняются на машине клиента, в то время как PHP серверный язык программирования. Поэтому для создания эффективных Web-приложений необходимо комбинировать PHP и JavaScript скрипты. Существует две возможности такого взаимодействия: передача переменных из JavaScript в PHP и динамическое формирование скриптов JavaScript средствами PHP.
Вариант 1. Передача переменных во внешний файл PHP.
Одной из распространенной задачей является определение разрешение экрана и глубину цвета монитора посетителя страницы средствами JavaScript с последующей передачей этих данные в PHP-скрипт. Это довольно часто встречающаяся задача, особенно при написании счетчиков посещений и создании «динамического дизайна». Скрипт JavaScript, выполняющий необходимые действия, размещен файле index.html, содержимое которого приведено в нижеследующем листинге:
Как видно, работа с данными из JavaScript, аналогична работе с данными, отправляющихся методом GET. Вариант 2. Динамическое формирование скриптов JavaScript средствами PHP внутри файла.
Перебор текущих элементов (.each)
Синтаксис метода each (пременяется только к выбранным элементам):
.each(function); // function - функция, которая будет выполнена для каждого элемента текущего объекта
Разберём, как работает метод на следующем примере (переберём элементы ):
<div id="id1"></div> <div id="id2"> <p></p> <hr> <p></p> <div id="id3"></div> </div> <script> // после загрузки DOM страницы выполнить $(function(){ // перебрать элементы div на странице $('div').each(function (index, element) { // index (число) - текущий индекс итерации (цикла) // данное значение является числом // начинается отсчёт с 0 и заканчивается количеству элементов в текущем наборе минус 1 // element - содержит DOM-ссылку на текущий элемент console.log('Индекс элемента div: ' + index + '; id элемента = ' + $(element).attr('id')); }); }); // Результат: // Индекс элемента div: 0; id элемента = id1 // Индекс элемента div: 1; id элемента = id2 // Индекс элемента div: 2; id элемента = id3 </script>
В вышеприведённом примере метод each использует текущий набор (элементы, выбранные посредством селектора ). В качестве обработчика метода each всегда выступает функция, которая будет выполнена для каждого элемента текущего набора (в данном случае для каждого элемента ). Данная функция имеет 2 необязательных параметра. Один из них (index) представляет собой порядковый номер текущей итерации, а второй (element) — DOM ссылку на текущий элемент. Кроме этого внутри функции доступно ключевое слово , которое также как и второй параметр, содержит DOM-ссылку на текущий элемент.
Например, выведем в консоль значение атрибута для всех элементов на странице:
$('a').each(function() { console.log($(this).attr('href')); });
Например, выведем в консоль все внешние ссылки, расположенные на странице:
$('a').each(function() { var link = $(this).attr('href'); if ((link.indexOf('http://') == 0) || (link.indexOf('https://') == 0)) { console.log('href ссылки = ' + link); } }); // Если на странице расположены следующие ссылки: // <a href="https://www.yandex.ru/">Яндекс</a> // <a href="post/2898">Как работает JavaScript?</a> // <a href="http://getbootstrap.com/">Bootstrap</a> // То в консоли увидим следующий результат: // https://www.yandex.ru/ // http://getbootstrap.com/
Например, рассмотрим, как организовать цикл each по элементам DOM, имеющих класс (переберём все элементы одного класса).
<!-- HTML-код --> <div class="name">Raspberry pi</div> <div>single-board compute</div> <div class="name">Intel Galileo Gen2</div> <div class="price">19$</div> <div class="name">Pine A64 Plus</div> <script> // с помощью функции jQuery.each ($.each) $.each($('.name'),function(index,data) { console.log('Порядковый номер: ' + index + ' ; Содержимое: ' +$(data).text()); }); // с помощью метода jQuery .each $('.name').each(function(index,data) { console.log('Порядковый номер: ' + index + ' ; Содержимое: ' +$(data).text()); }); // Получим следующий ответ: // Порядковый номер: 0 ; Содержимое: Raspberry pi // Порядковый номер: 1 ; Содержимое: Intel Galileo Gen2 // Порядковый номер: 2 ; Содержимое: Pine A64 Plus </script>
Например, разберём, как перебрать все элементы на странице.
<script> $('*').each(function() { console.log(this); }); </script>
Например, выведем значение всех элементов на странице.
$('input').each(function() { console.log($(this).val()); });
Например, переберём все дочерние элементы, расположенные в с (each children).
<!-- HTML список --> <ul id="myList"> <li>HTML</li> <li>CSS</li> <li>JavaScript</li> </ul> <script> $('ul#myList').children().each(function(){ console.log($(this).text()); }); // Результат: // HTML // CSS // JavaScript </script>
Рассмотрим способ, с помощью которого можно определить последний индекс (элемент) в методе jQuery .
Объявление переменных
Прежде чем использовать переменную в JavaScript, ее необходимо объявить. Переменные объявляются с помощью ключевого слова var следующим образом:
Один раз использовав ключевое слово var, можно объявить несколько переменных:
Объявление переменных можно совмещать с их инициализацией:
Если начальное значение в инструкции var не задано, то переменная объявляется, но ее начальное значение остается неопределенным (undefined), пока не будет изменено программой.
Если вы имеете опыт использования языков программирования со статическими типами данных, таких как C# или Java, то можете заметить, что в объявлениях переменных в языке JavaScript отсутствует объявление типа. Переменные в языке JavaScript могут хранить значения любых типов. Например, в JavaScript допускается присвоить некоторой переменной число, а затем этой же переменной присвоить строку:
С помощью инструкции var можно объявить одну и ту же переменную несколько раз. Если повторное объявление содержит инициализатор, то оно действует как обычная инструкция присваивания.
Если попытаться прочитать значение необъявленной переменной, JavaScript сгенерирует ошибку. В строгом режиме, предусмотренном стандартом ECMAScript 5, ошибка также возбуждается при попытке присвоить значение необъявленной переменной. Однако исторически и при выполнении не в строгом режиме, если присвоить значение переменной, не объявленной с помощью инструкции var, то JavaScript создаст эту переменную как свойство глобального объекта, и она будет действовать практически так же, как корректно объявленная переменная. Это означает, что глобальные переменные можно не объявлять. Однако это считается дурной привычкой и может явиться источником ошибок, поэтому всегда старайтесь объявлять свои переменные с помощью var.
Область видимости переменной
Область видимости (scope) переменной — это та часть программы, для которой эта переменная определена. Глобальная переменная имеет глобальную область видимости — она определена для всей JavaScript-программы. В то же время переменные, объявленные внутри функции, определены только в ее теле. Они называются локальными и имеют локальную область видимости. Параметры функций также считаются локальными переменными, определенными только в теле этой функции.
Внутри тела функции локальная переменная имеет преимущество перед глобальной переменной с тем же именем. Если объявить локальную переменную или параметр функции с тем же именем, что у глобальной переменной, то фактически глобальная переменная будет скрыта:
Объявляя переменные с глобальной областью видимости, инструкцию var можно опустить, но при объявлении локальных переменных всегда следует использовать инструкцию var.
При объявлении глобальной переменной в JavaScript в действительности создается свойство глобального объекта. Если глобальная переменная объявляется с помощью инструкции var, создается ненастраиваемое свойство, т.е. свойство, которое невозможно удалить с помощью оператора delete. Как уже отмечалось выше, если не используется строгий режим и необъявленной переменной присваивается некоторое значение, интерпретатор JavaScript автоматически создает глобальную переменную. Переменные, созданные таким способом, становятся обычными, настраиваемыми свойствами глобального объекта.
описание проблемы
во-первых, давайте разберемся в потоке событий, когда страница обслуживается с нашего сервера:
- сначала запускается PHP, он генерирует HTML, который подается клиенту.
- затем HTML доставляется клиенту, после того, как PHP будет сделан с ним, я хотел бы подчеркнуть, что как только код покинет сервер-PHP будет сделан с ним и больше не сможет получить доступ он.
- затем HTML с JavaScript достигает клиента, который может выполнять JS на этом html.
так действительно, основная вещь, чтобы помнить здесь, что HTTP не имеет состояния. Как только запрос покинул сервер, сервер не может его коснуться. Таким образом, это оставляет наши варианты:
- отправить больше запросов от клиента после первоначальный запрос выполняется.
- кодировать то, что сервер должен был сказать в начальный запрос.
Функция jQuery(html[,ownerDocument])
Эта function позволяет создавать DOM-узлы в памяти, что называется «на лету», используя HTML-строку, которую можно передать в качестве аргумента. Способ (метод) вызова функции даёт возможность запустить её с помощью двух параметров:
— html — относится к обязательному параметру типа htmlString. По сути, это строка, содержащая HTML-код;
— ownerDocument — относится к необязательным параметрам типа document.
Принцип работы функции:
— анализируется значение параметров;
— если он выглядит, как HTML-код, функция обрабатывает его с помощью метода $.parseHTML();
— после обработки запускается процесс создания DOM-узлов (применяется браузерный механизм .innerHTML);
— в конечном итоге функция возвращает объект jQuery, включающий созданные DOM-узлы.
Если пользоваться только одним параметром, элементы создаются для текущего документа. Если хотите создать элементы для другого документа, нужно передавать и 1-й, и 2-й параметры.
Один последний факт:
Переменные, объявленные внутри функции без ключевого слова, станут глобальными переменными. Взглянем на это в следующем примере:
function funFact() { isGloballyAvailable = true;}funFact();console.log(isGloballyAvailable); // записывает true
Чтобы понять что происходит, нам нужно вернуться назад к понятию поднятия. Обычно при инициализации переменной в нашем коде интерпретатор ищет «поднятые переменные» и затем присваивает или переназначает значение переменной. Однако, когда интерпретатор не может найти переменную внутри функции, он ищет ее среди переменных родительской функции, пока не дойдет до глобальной области видимости.
В нашем случае интерпретатор не найдет ‘isGloballyAvailable’ даже в глобальной области видимости, поэтому он автоматически туда ее добавит.
Это невероятно опасный процесс, которого лучше не допускать. Поэтому имейте в виду, что объявлять переменные без ключевых слов var, let и const нельзя.
Константы
Многие языки программирования используют константы – это значения, которые нельзя изменить. То есть значения, назначенные константе, не могут быть переназначены.
По общему соглашению идентификаторы const пишутся в верхнем регистре. Это отличает их от других переменных.
В приведенном ниже примере переменная SPECIES инициализируется как константа с помощью ключевого слова const. Попытка переназначить переменную приведет к ошибке.
Поскольку значения const нельзя переназначить, их необходимо объявить и инициализировать в одно и то же время, иначе возникнет ошибка.
Значения, которые не могут измениться при программировании, называются неизменяемыми, а значения, которые могут быть изменены – изменяемыми (это очевидно). Значения константы не могут быть переназначены, однако они изменяемы, поскольку свойства объектов, объявленных с помощью const, можно изменять.
Константы позволяют вам сообщить другим программистам, работающим над проектом, и себе о том, что данную переменную не следует переназначать. Чтобы объявить переменную, которую можно переназначить, следует использовать let.
Наконец, более полный пример
В завершение давайте разберем окончательный рабочий пример неизменяемого класса в PHP. В этом примере также было добавлено указание типов в PHP 7.
declare(strict_types=1); final class SkateboardTrick { private $inventor, $trickName; private $mutable = true; public function __construct(string $skater, string $trick) { if (false === $this->mutable) { throw new \BadMethodCallException('Конструктор вызван дважды.'); } $this->inventor = $skater; $this->trickName = $trick; $this->mutable = false; } public function getInventor(): string { return $this->inventor; } public function getTrickName(): string { return $this->trickName; } }
Строгий режим объявления типов и его применение для аргументов функций еще больше усиливает неизменяемый класс. Например, мы не получим неожиданно объекта в качестве аргумента. Это было бы плохо, потому что такой объект мог бы быть изменен где-то еще, что изменило бы содержимое нашего неизменяемого объекта — это плохо! Больше об этом в следующей статье.
Поднятие переменных (hoisting)
Области видимости (как функции, так и блока) работают по правилу:
любая переменная, объявленная в области видимости, присоединяется к этой области видимости.
Можно предположить, что весь код, который вы видите в программе на JavaScript, интерпретируется строка за строкой. Несмотря на то, что по сути это правда, есть одна часть этого предположения, которая может привести к некорректному пониманию вашей программы.
На самом деле движок JavaScript скомпилирует ваш код до того, как начнет интерпретировать его. Частью фазы компиляции является нахождение и ассоциация всех объявлений с их соответствующими областями видимости (подробнее ).
Например:
JavaScript
a = 2;
var a;
console.log(a); // 2
1 |
a=2; vara; console.log(a);// 2 |
Но если мы немного изменим код, то получим иной результат:
JavaScript
console.log(a); // undefined
var a = 2;
// приведенная выше запись при работе движка аналогична коду:
var a;
console.log(a); // undefined (переменная а не определена)
a = 2;
1 |
console.log(a);// undefined vara=2; vara; console.log(a);// undefined (переменная а не определена) a=2; |
Когда мы видим var a = 2;, то думаем о нем как об одном операторе. Но JavaScript на самом деле обрабатывает его как два оператора:
- var a; — первый оператор (объявление) обрабатывается во время фазы компиляции;
- a = 2; — второй оператор (присваивание) остается на своем месте в фазе исполнения.
Получается, что объявления переменной или функции «переезжают» с того места, где они появились в коде в начало кода. Это явление имеет название «поднятие (hoisting)».
Пример с функцией:
JavaScript
foo(); // функция может быть вызвана, т.к. её объявление поднято (hoisting)
function foo() {
console.log(a); // undefined (т.к. а = 2 присвоено ниже; var a поднимается наверх foo(..), а не наверх всей программы)
var a = 2;
}
1 |
foo();// функция может быть вызвана, т.к. её объявление поднято (hoisting) functionfoo(){ console.log(a);// undefined (т.к. а = 2 присвоено ниже; var a поднимается наверх foo(..), а не наверх всей программы) vara=2; } |
Объявление функции foo (которое в этом случае включает в себя соответствующее значение как актуальную функцию) поднимается, благодаря чему ее вызов в первой строке может быть выполнен.
JavaScript
foo(); // ReferenceError, а TypeError
var foo = function bar() {
// …
};
1 |
foo();// ReferenceError, а TypeError varfoo=functionbar(){ // … }; |
Идентификатор переменной foo поднимается и присоединяется к включающей его области видимости (глобальной) этой программы, поэтому foo() не вызовет ошибки ReferenceError. Но в foo пока еще нет значения (как если бы это было объявление обычной функции вместо выражения). Поэтому, foo() пытается вызвать значение undefined, которое является неправильной операцией с вызовом ошибки TypeError.
Также помните, что даже если это именованное функциональное выражение, идентификатор имени недоступен в окружающей области видимости:
JavaScript
foo(); // TypeError
bar(); // ReferenceError
var foo = function bar() {
// …
};
1 |
foo();// TypeError bar();// ReferenceError varfoo=functionbar(){ // … }; |
Этот код более точно интерпретируется (с учетом поднятия) как:
JavaScript
var foo;
foo(); // TypeError
bar(); // ReferenceError
foo = function() {
var bar = …self…
// …
}
1 |
varfoo; foo();// TypeError bar();// ReferenceError foo=function(){ varbar=…self… // … |
Пример очередности поднятия функций и переменных
Сначала поднимаются функции, а затем уже переменные. Например:
JavaScript
foo(); // 1
var foo;
function foo() {
console.log( 1 );
}
foo = function() {
console.log( 2 );
};
1 |
foo();// 1 varfoo; functionfoo(){ console.log(1); } foo=function(){ console.log(2); }; |
1 выводится вместо 2, так как код интерпретируется движком так:
JavaScript
function foo() {
console.log( 1 );
}
foo(); // 1
foo = function() {
console.log( 2 );
};
1 |
functionfoo(){ console.log(1); } foo();// 1 foo=function(){ console.log(2); }; |
JavaScript
foo(); // 3
function foo() { // первое объявление функции foo()
console.log( 1 );
}
var foo = function() {
console.log( 2 );
};
function foo() { // второе объявление функции foo() (перекрывает первое и выводит «3»)
console.log( 3 );
}
1 |
foo();// 3 functionfoo(){// первое объявление функции foo() console.log(1); } varfoo=function(){ console.log(2); }; functionfoo(){// второе объявление функции foo() (перекрывает первое и выводит «3») console.log(3); } |
Еще немного материала для чтения
- Использование XMLHttpRequest — MDN
- Ссылка на объект XMLHttpRequest — MDN
- Как вернуть ответ от асинхронного вызова?
2. Перенесите данные на страницу и используйте JavaScript для получения информации из DOM.
Этот метод менее предпочтителен, чем AJAX, но все же имеет свои преимущества. Он все еще относительно разделен между PHP и JavaScript в том смысле, что в JavaScript нет прямого кода.
Доводы
Быстрые — операции DOM часто бывают быстрыми, и вы можете хранить и получать доступ к большому количеству данных относительно быстро.
Против
- Потенциально несемантическая разметка — обычно происходит то, что вы используете какой-то для хранения информации, потому что легче получить информацию из , но это означает, что у вас есть бессмысленный элемент в ваш HTML. HTML имеет элемент для данных о документе, а HTML 5 вводит атрибуты для данных специально для чтения с помощью JavaScript, который можно связать с конкретными элементами.
- Загрязнение источника — данные, которые генерирует PHP, выводятся непосредственно в источник HTML, а это означает, что вы получаете больший и менее сфокусированный источник HTML.
- Труднее получить структурированные данные — структурированные данные должны быть действительными HTML, иначе вам придется самостоятельно экранировать и преобразовывать строки.
- Сильно связывает PHP с логикой ваших данных — поскольку PHP используется в презентации, вы не можете четко разделить их.
Итоги
- В JavaScript можно объявлять переменные используя ключевые слова , и .
- При объявлении переменной желательно указать ее первоначальное значение, поскольку если забыть ее инициализировать перед первым использованием, результаты вычисления могут быть неопределенными.
- JavaScript – это нетипизированный язык, в частности, это значит, что переменная может содержать значение любого типа.
- Глобальные переменные принято объявлять в начале скрипта, чтобы все функции наследовали эти переменные и их значения.
- Внутри программной единицы (функции, подпрограммы, блока) локальная переменная имеет преимущество перед глобальной переменной с тем же именем.
Какие кавычки правильно использовать для вывода текста в PHP
Я не буду грузить Вам голову маразмом, итак одну вещь рассказал выше. Поэтому давайте сразу перейдем к тому, как правильно делать вывод!
Правило №1 — без кавычек мы пишем числа и переменные:
Правило №2: Одинарные кавычки используем когда хотим вывести в неизменном виде то, что содержится внутри кавычек, а это мы хотим сделать всегда:
Заметьте, что теги отправляются в браузер в неизменном виде, а браузер, в свою очередь, обрабатывает их и выводит как теги, то есть уже отформатированный код. Снова же мы повторяем, что PHP — генерирует HTML, а не текст.
Исключения из правил, когда мы хотим вывести спецсимволы такие как знак больше или меньше, или целый блок HTML, то мы применяем функцию htmlspecialchars:
Правило №3: двойные кавычки применяем, когда хотим вывести обработанную строку, то есть практически никогда. Не смотря на о, что следующий код сможет вывести переменную:
Данный код считается ужасным, банально потому что мы не можем читать наш код и не понимаем его поведение:
Глядя на код выше выведется Friends или FrienBeer ? Это называется не очевидным поведением, а значит в будущем ещё не раз поведение этого кода может быть изменено. Никогда не пишите код так, чтобы нельзя было его сразу быстрым взглядом понять. Правильно было бы:
Но не смотря на это мы двойные кавычки используем в двух случаях, когда нам надо вывести перевод строки (не HTML) либо спецсимвол:
В исходном коде страницы Вы можете увидеть как работает перевод строки и понять разницу.