Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Что изменение arguments вызывает изменение соотвествующих локальных переменных:
(function(){
var a = 'a';
console.log(a); // => 'a'
arguments[0]='b';
console.log(a); // => 'a'
})();

var name;
new function Cat() {
this.name = 'barsik';
var obj = this;
(function() {
console.log(obj.name); // => barsik
})();
}
var name = 123;
new function Cat() {
this.name = 'barsik';
var f = function() {
console.log( this.name);
};
this.f = f;
f(); //123
new f(); //undefined
this.f(); //barsik
}
var name = "global context";
function test() {
var name = "local context";
(function () {
console.log(name);
})()
}
test() // "local context"
(function () {
console.log('this', this);
})();
shock@localhost:~> node scope.js
this [object global]f(); //123
new f(); //undefined
this.f(); //barsik var byt = num.toString(2);
if (byt.length != 8) {
byt = addByte(byt)
}
function addByte(byt) {
while (8 != byt.length) {
byt = '0' + byt;
}
return byt;
}byt = (512 | num).toString(2).substr(1)num & 1)Math.floor (~~num или num >> 0), как следствие быстрый Math.roundX << N, X >> N)e.keyCode^27 || e.preventDefault(); вместо e.keyCode === 27 && e.preventDefault(); и конструкций с ifvar MAX = 10000000, i;
console.time('~~');
for (i = 0; i < MAX; i += 1.1) ~~i;
console.timeEnd('~~');
console.time('floor');
for (i = 0; i < MAX; i += 1.1) Math.floor(i);
console.timeEnd('floor');
shock@localhost:~> node speed.js
~~: 222ms
floor: 198ms
shock@localhost:~> node speed.js
~~: 216ms
floor: 197ms
shock@localhost:~> node speed.js
~~: 218ms
floor: 194ms
node -v ?). Во всех браузерах ~~ быстрее либо значительно быстрее Math.floor. Думаю, что v8 закэшировал/оптимизнул.var MAX = 10000000, i, arr = [];
console.time('~~');
for (i = 0; i < MAX; i += 1.1) arr.push(~~i);
console.timeEnd('~~');
console.time('floor');
for (i = 0; i < MAX; i += 1.1) arr.push(Math.floor(i));
console.timeEnd('floor');
console.log(arr[~~(Math.random() * arr.length)])
shock@localhost:~> node speed.js
~~: 570ms
floor: 530ms
9444389
shock@localhost:~> node -v
v0.3.0
// 1. typeof RegExp
// - WebKit'ы
typeof /[a-z]{2,4}/ // function RegExp, конечно имеет некоторое поведение функции,
// например его можно вызвать как функцию, но WebKit'ы что-то перепутали
// - Остальные браузеры
typeof /[a-z]{2,4}/ // object
// 2. typeof DOM method
// - IE8-
typeof document.getElementById // object - лол!.. однако этот объект имеет все методы function
// и адекватно отзывается на (document.getElementById + '') -
// function getElementById() {
// [native code]
// }
// - Остальные браузеры
typeof document.getElementById // function
// 3. Бородатый боян
// - IE8-
'v'=='\v' // true ИЕ 8 не имеет символа вертикальной табуляции \v
// - Остальные браузеры
'v'=='\v' // false
Что this во вложенных функциях ссылается на глобальный объектНе путаемся и других не путаем! Ссылка this зависит от способа вызова функции, а не от способа и места задания функции.
1. При прямом вызове функции (т.е. без catch, with, bind, call, apply) то, что слева от точки перед именем функции, то и будет this.
2. Если точки нет this === глобальный объект (для браузеров это window).
3. Если функция стоит в позиции выражения, то this будет всегда глобальный объект
var c = 0,b,a,e = {c: 8};
a = {
c: 150,
b: function() {
return this.c;
}
};
// 1.
a.b(); // 150 this === a смотрим, то что перед точкой
// 2.
b = a.b;
b(); // 0 this === window ибо точки нет
// 3.
(a.b)(); // 150 скибки не ставят функцию в состояние выражения поэтому смотрим то, что перед точкой
(false || a.b)(); // 0 позиция выражение
(0, a.b)(); // 0 позиция выражение
(e.b = a.b)(); // 0 позиция выражение
e.b(); // 8 this === e Если вызвать после присвиавния, то будет работать правило 1
(true ? a.b : a.c)(); // 150 не выражение
a[true ? 'b' : 'c'](); // 150 не выражение
Ссылка this зависит от способа вызова функции, а не от способа и места задания функции.
b = a.b; b(); и this в эвентах — распространенные болезни).var a = new function () {
console.log('a', this); // [object Object]
this.foo = 'bar';
};
console.log('value:', a.foo); // 'bar'
(function () {
console.log('b', this); // [object global] || DOMWindow
})();
var A = function () {
console.log('a', this); // [object Object] при вызове конструктора через new this - пустой объект
this.foo = 'bar';
};
var a = new A;
console.log('value:', a.foo); // 'bar'
var B = function () {
console.log('b', this); // [object global] || DOMWindow - правило 2
};
B();
<source>
Справочник, посвященный тонкостям JavaScript