Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А алерт — это для наглядности.
$ node
> alert('Hi')
ReferenceError: alert is not defined
at repl:1:2
at REPLServer.self.eval (repl.js:110:21)
at Interface.<anonymous> (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:754:14)
at ReadStream.onkeypress (readline.js:99:10)
at ReadStream.EventEmitter.emit (events.js:98:17)
at emitKey (readline.js:1089:12)
>
Из-за слабой типизации, почти все данные в JavaScript-е являются объектами.Вот это сурово!
object — какая в ней типизация?// строка-примитив
var str1='string';
console.log(typeof str1); // string
// строка-объект
var str2=new String('string');
console.log(typeof str2); // object
// создаем временный объект, аналогичный str2, его свойству q присваиваем 1
str1.q=1;
// тут продолжаем работать с примитивом - у него нет этого свойства
console.log(str1.q); // undefined
// str2 - объект, соответственно никакая обертка не создается и работаем с его свойствами
str2.q=1;
console.log(str2.q); // 1
String.prototype.met=function(){console.log(typeof(this))}
console.log(typeof 'string'); // string
// внутри методов контекстом будет этот временный объект
'string'.met(); // object
obj.f — вызов метода, а obj.method(:f) — объект.int f() {
return 123;
}
/* будет работать */
int (*ptr)() = f;
(*ptr)();
/* допустимо, но никто не гарантирует, что это будет работать на конкретной машине */
int (*ptr)() = (int (*)()) 0xfe017c24h;
(*ptr)();
bool c = true;
std::function<bool(int, int)> f = [&] (int a, int b) -> bool {
return c ? a < b : a > b;
}
/* ... */
c = true;
f(5, 3); // false
c = false;
f(5, 3); // true
struct __my_functor{
bool& c;
__my_functor(bool &c): c(c) {}
bool operator() (int a, int b) { return c ? a < b : a > b; }
};
/* ... */
bool c = true;
__my_functor f(c);
/* ... */
c = true;
f(5, 3); // false
c = false;
f(5, 3); // true
void f(int [] array, size_t size);
/* ... */
int array[5];
/* тут доступны begin() и end() */
for (int a : array) {
std::cout << array << std::endl;
}
f(array, 5);
/* ... */
void f(int [] array, size_t size) {
/* а тут уже нет */
for (int i = 0; i < size; ++i) {
std::cout << array[i] << std::endl;
}
}
auto f = [&] (int a, int b) -> bool {
return c ? a < b : a > b;std::function<bool(int, int)> f = [&] (int a, int b) -> booloperator(), а в JS любая определенная пользователем функция является объектом.может осуществлять приведение типов для сравнения или использования
var a = 5;
if (a) {
// do something
}
var a = 5;
a = 'String'
2 + 2.0 -- Сложение двух вещественных чисел, результат = 4.0
(2 :: Integer) + 2.0 -- Ошибка компиляции, функция (+) требует одинакового типа операндов
let a = 2 -- Именованная константа a имеет тип Integer
a + 2.0 -- И снова ошибка компиляции
let b :: Num x => x; b = 2 -- Именованная константа b является полиморфной
b + 2.0 -- Работает, результат = 4.0
let c = 2 in c + 2.0 -- Механизм вывода типа справился, с имеет тип Double, результат 4.0
Стоп, в Haskel же нет перегрузки функций! Потому и значения разных типов складывать нельзя, никак.
а дальше вывод типов поработает и приведет все к одному типу, на котором определен + (который всегда принимает 2 одинаковых типа, он не может быть определен для разных типов никак)
object → [[proto]] → [[proto]] → [[proto]] → null[[scope]] → [[scope]] → [[scope]] → window → nullwith() всего-то навсего добавляет в эту цепь произвольный объект. И тогда js стал для меня из непредсказуемой штуки красивым и изящным языком.var o = Object.create(function(){
var stashedProtoval;
return Object.create({}, {protoval:{
get: function(){ return stashedProtoval; },
set: function(v){ stashedProtoval = v; },
configurable: true,
enumerable: true
}});
}());
o.protoval; // undefined
o.protoval = 42;
o.protoval; // 42
o.hasOwnProperty('protoval'); // falseВ данном примере переменная title была объявлена дважды – первый раз глобально, а второй раз – внутри функции. Благодара тому, что внутри функции example переменная title была объявлена с помощью ключевого слова var, она становится локальной и никак не связана с переменной title, объявленной до функции. В результате выполнения кода вначале выведется «internal» (внутренняя переменная), а затем «external» (глобальная переменная).
var o = { x: 1 };
function addY(obj) {
obj.y = 2;
}
function addZ(obj) {
//повторно объявим obj
var obj;
obj.z = 3;
}
addY(o);
console.log(o); // => { x: 1, y: 2 }
addZ(o);
console.log(o); // => { x: 1, y: 2, z: 3 }
void function() {"use strict";
for(let counter=1; counter <=10; counter++){
let _counter = counter;
$('<div>').css({
//...
}).html('<h1>'+ counter +'</h1>')
.appendTo('body')
.click(function(){
alert(_counter);
});
}
}.call(null)
let _counter = counter; можно было бы опустить, если бы браузеры релизовали let по спецификацииfor(var counter=1; counter <=10; counter ++){
$('<div>').css({
"border": "solid 1px blue",
"height": "50px",
"margin": "10px",
"text-align": "center",
"width": "100px"
}).html('<h1>'+ counter +'</h1>')
.appendTo('body')
.click(window.alert.bind(window, counter));
}
При попытке присвоить переменной значение, переменная будет создана в глобальной области видимости, и ей присвоится значение.
Я думаю этот вопрос все же лучше рассмотреть отдельно, потому что если рассматривать их в одном топике, топик будет слишком сложным.
Если убрать ключевое слово var из строки var title = 'internal', то запустив код, в результате дважды получим сообщение «internal». Это происходит из-за того, что при вызове функции мы объявляли не локальную переменную title, а перезаписывали значение глобальной переменной!
var title = «external title»;
function example(){
title = «changing external title»;
alert(title);
…
example();
Если закомментировать строку title = «changing external title»;, то при первым сгенерированным сообщением станет «undefined» — локальная переменная title уже была инициализирована (существует), но значение (на момент вызова alert-а) не было присвоено.
первым сгенерированным сообщением станет «undefined»
function example(){
alert(title);
var title = "internal title";
}
function example(){
var title;
alert(title);
title = "internal title";
}
Особенности работы или «За что я люблю JavaScript»: Замыкания, Прототипирование и Контекст