Разбирате ли JavaScript ?
Посочените по-долу тестове са написани от Dmitry Baranovskiy в неговия блог под заглавието “So, you think you know JavaScript?“. Интересни са и затова ги copy/paste-вам тук.
Можете ли да отговорите какво ще върне всеки alert() докато четете кода, без да го тествате?
if (!("a" in window)) { var a = 1; } alert(a);
var a = 1, b = function a(x) { x && a(--x); }; alert(a);
function a(x) { return x * 2; } var a; alert(a);
function b(x, y, a) { arguments[2] = 10; alert(a); } b(1, 2, 3);
function a() { alert(this); } a.call(null);
Categories: JavaScript
Само това третото не можах да позная. Идея си нямам как изведнъж променливата приема съдържанието на функцията. Някакви магии
Честно казано това и аз не го разбрах, но пък работи точно както казваш
това става заради така-наречения ‘hoisting’ който извършва javascript. във всеки scope където се декларират функции и променливи, компилаторът анализира content и ‘премества’ всички променливи най-горе, последвани от assignment-а, който става по-долу. В този случай, става равносилно на: var a; a = function(x) { return x * 2; }; alert(a);
прочетете повече на google
ето и един пример, където вместо да получим exception поради употребата на не-инциализирана променлива, получаваме просто undefined, защото е празна след hoisting:
http://www.jsfiddle.net/4tYRD/1/
(function() {
alert(foo); // undefined but not an exception
var foo = 1;
})();