Javascript.RU

Разное о js

Решил интересные нюансы выносить в блог.

Переменные 1
Оказывается вот в этом коде a this.a window.a window['a'] это всё одно и тоже, вот это да...

a =10;         
alert(a);                //10
alert(this.a);          //10
alert(window.a);    //10
alert(window['a']);
str="a";
alert(window[str]);  //10

Переменные 2

Оказывается, при повторном объявлении переменной, она не перезатирается на значение undefined

var b;
alert(b); // Что то из то что в ней осталось из сайта , интересно )))
b=10;
alert(b); // 10
var b;
alert(b); // 10

Функции
Оказывается вот эти два определения функции это одно и тоже

k=function() {alert(1)}
k();

function z()
{
alert(2);
}
z();

Очень интересный пример

k=function() {alert(1)}
k();                 //1
this.k();           //1
window.k();      //1
window['k']();    //1

function z()
{
alert(2);
}
z();              //2
this.z();        //2
window.z();   //2
window['z']();//2

А здесь интересней сначала компилится второй код, затем первый.

k=function() {alert(1)} // Создаётся при исполнении
k();

function k()      // Функции компилятся первыми, вне зависимости где они стоят
{
alert(2);
}
k();

Двойное отрицание

alert("z="+z);
alert("!z="+!z);
alert("!!z="+!!z);
var z;
var z=1;
alert("z="+z);
alert("!z="+!z);
alert("!!z="+!!z);

Разное

alert($(1)(3));
function $(a) {
  return function(b) {
    return a+b;
  }
}
alert($(1)(2)(3)(4)(5));
function $(a) {
  return function(b) {
    return function(c) {
      return function(d) {
        return function(e) {
             return a+b+c+d+e;
        }
      }
    }
  }
}

Декремент ,инкремент

a=5;
b=5;
c= ++b;
alert(c);
c= a++;
alert(c);

a=5;
b=5;
c=a++ + ++b;
alert(c);

Тернарный знак ? : // Тоже самое, что if else

a=5;
a<4?alert("a<4"):alert("a>4");
a=10;
a<5?alert("a<5"):a<6?alert("a<6"): (a<7?alert("a<7"):a<8?alert("a<8"):alert("a>10"));

// Если несколько функций надо выполнить в блоке
Два самых лучших способа
Первый способ:

a=10
a<5? ( alert(1) , alert(2) , alert(3) , alert(4) ) : ( alert(6) , alert(7) , alert(8) , alert(9) );

Второй способ

a=10;
a<5? (function(){alert(1) , alert(2) , alert(3) , alert(4)})() : (function(){ alert(6) , alert(7) , alert(8) , alert(9) })();

Интересное о функциях

function z(a,b,c)
{
alert(arguments.callee); // arguments.callee содержит саму функцию
                                 // Что интересно коменты туда не входят
}
z(1,2,3);
function z(a,b,c)
{
alert("arguments[0]="+arguments[0]);
alert("arguments[1]="+arguments[1]);
alert("arguments[2]="+arguments[2]);
alert("arguments.length="+arguments.length);
}
z(1,2,3);
function z(a,b,c)
{
alert(arguments.callee==z);
alert(arguments.callee==b);
}

z();
(function z(a,b,c)
{
alert(a+b+c);
})(1,2,3);
(function z(a,b,c)
{
return function(d,e) {alert(a+b+c+d+e)}
})(1,2,3)(4,5)
(function(a,b,c)
{
return function(d,e)
         {
            return function() {alert(a+b+c+d+e);}
         }
})(1,2,3)(4,5)();
var i=0;
(function z()
{
i++;
if(i<10) return arguments.callee();
})();
alert(i);
function z(i)
{
i++;
if(i<10) return arguments.callee(i);
else return i;
}
alert(z(1));
(function(i)
{
i++;
if(i<10) return arguments.callee(i)
alert(i);
}
)(1);

Блоки
{} - не задают отдельную область видимости

i=0;
{
var i=1;
alert(i);
}
alert(i);
-4

Автор: PeaceCoder, дата: 21 января, 2010 - 23:11
#permalink

Оказывается вот в этом коде a this.a window.a window['a'] это всё одно и тоже, вот это да...

В глобальной области видимости все переменные - свойства window

Оказывается, при повторном объявлении переменной, она не перезатирается на значение undefined

Смысл var - выделение памяти и закрепление ее в области локальной видимости.

Оказывается вот эти два определения функции это одно и тоже

Если я не ошибаюсь, не одно и тоже. Точнее одно и тоже ток механика создания разная.

Но первое почему-то имеет приоритет над вторым

Это не приоритет, а механика JS. Перед выполнением функции - она компилируется. Способ обьявления функции function name(){} является глобальным и она создается до исполнения, а var name= function(){} поточным и создается при исполнении.

http://javascript.ru/basic/functions#sozdanie-funkciy


Автор: mycoding, дата: 21 января, 2010 - 23:25
#permalink

Спасибо,очень доходчево.


Автор: Octane, дата: 21 января, 2010 - 23:48
#permalink

В глобальной области видимости все переменные - свойства window

Глобальные переменные и свойства объекта windows — разные вещи.

Смысл var - выделение памяти и закрепление ее в области локальной видимости.

Все переменные создаются сразу при входе в контекст, поэтому "типа последующие переопределения" ни к чему не приводят.

Это не приоритет, а механика JS. Перед выполнением функции - она компилируется. Способ обьявления функции function name(){} является глобальным и она создается до исполнения, а var name= function(){} поточным и создается при исполнении.

Глобальные функции создаются в глобальном контексте, остальные остаются жить в своем контесте. Здесь таже ситуация, что и в предыдущем случае с var, Function Declaration обрабатываются сразу при входе в контекст, а Function Expression — по ходу выполнения.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
8 + 8 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
mycoding
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum