Написано для себя и команды.
varТолько так можно избежать глобальных переменных.
=== а не ==Не пытайтесь запомнить, что
[7] == 7 — это true, что '7' == 7 и
[] == 0 — это тоже true. Запомнить все нюансы
невозможно. Просто запомните, что
поведение == весьма коварно. Используйте ===.
; вместо переводов строкЗнайте, что JavaScript использует своеобразный
препроцессинг, чтобы расставить ; за вас
(ASI — Automatic Semicolon Insertion). Этот
препроцессинг может вести себя не так, как вы ожидаете.
Например
function f() {
return
[1, 2, 3]
}
Вернёт undefined, так как после return будет добавлена ;.
typeof, instanceof и constructortypeof [] — 'object', typeof null — тоже 'object' и не только это.
Это позволяет максимально разделить области видимости переменных.
arguments в массивvar argArray = Array.prototype.slice.call(arguments);
NaN и Infinity!isNaN(parseFloat(n)) && isFinite(n);
Если в контексте есть много переменных, ссылки на DOM или другие тяжёлые объекты, то при создании замыканий следует ограничить число переменных для замыкания только необходимыми.
function big_function() {
// много переменных, среди которых есть some_data
var some_data;
/*
это плохо, так как в f замкнутся все переменные из контекста,
а не только some_data
function f() {
console.log(some_data);
}
*/
// а это хорошо
var f = (function(some_data) {
return function() {
console.log(some_data);
}
}(some_data));
}
var работает в начале области видимостиПри активном использовании замыканий, разграничении скоупов и
создании вложенных скоупов (все эти приёмы полезны) надо быть
осторожным с лишними var и помнить об их неявном выполнении
вначале области видимости.
В этом примере разработчик постарался замкнуть переменную x
со значением true.
var f = (function(x) {
return function() {
console.log(x);
if (x) {
var x = 2;
}
console.log(x);
}
}(true));
f();
Если бы перед x не было бы var, то код сработал бы так,
как задумал автор:
true
2
Однако, несмотря на то, что во внешнем скоупе x=true,
ветка if выполнена не будет. И невзирая на то, что она
выполнена не будет, var x всё же сработает. Результат будет таким:
undefined
undefined
Всё это случится потому, что этот код будет интерпретирован так:
var f = (function(x) {
return function() {
var x; // x = undefined
console.log(x); // будет напечатано "undefined"
if (x) {
// ветка не сработает
x = 2;
}
console.log(x); // будет напечатано "undefined"
}
}(true));
f();
var работает не там, где написан и не тогда, когда выполнение доходит
до него.
$.each, $.map, $.proxy, $.extend, $.grep,
$.merge, $.now, $.parseJSON… Они компактны,
надёжны, переносимы. Нативные JavaScript-методы,
обеспечивающие аналогичную функциональность, оказываются
доступны не всегда.