Жигалов Сергей
class User {
private:
int age=30;
public:
void showAge() {
std::cout << this->age;
};
};
int main() {
User* sergey = new User;
sergey->showAge();
}
public class User {
private int age = 30;
public void showAge() {
System.out.println(this.age);
}
}
public static void
main(String []args) {
User sergey = new User();
sergey.showAge();
}
function User () {
return {
age: 30,
showAge: function () {
console.log(this.age);
}
}
}
var sergey = new User();
sergey.showAge();
console.log(this.innerWidth); //1684
this.process.version; // 'v0.12.7'
function add(a, b) {
return a + b;
}
var sum = add(4, 2);
function add(a, b) { return a + b; } var sum = add(4, 2);
globalContext = { lexicalEnv: { } };
function add(a, b) { return a + b; } var sum = add(4, 2);
globalContext = { lexicalEnv: { sum: undefined } };
function add(a, b) { return a + b; } var sum = add(4, 2);
globalContext = { lexicalEnv: { sum: undefined, add: <ссылка на add> } };
function add(a, b) { return a + b; } var sum = add(4, 2);
functionContext = { lexicalEnv: { }, parentEnv: globalContext.lexicalEnv };
function add(a, b) { return a + b; } var sum = add(4, 2);
functionContext = { lexicalEnv: { a: 4, b: 2 }, parentEnv: globalContext.lexicalEnv };
function add(a, b) { return a + b; } var sum = add(4, 2);
functionContext = { lexicalEnv: { a: 4, b: 2 }, parentEnv: globalContext.lexicalEnv, this: <ссылка на объект> };
function func() {
return this;
}
func(); // window
function strictFunc() {
'use strict';
return this;
}
strictFunc(); // undefined
var sergey = {
age: 30,
getAge: function () {
'use strict';
return this.age;
}
}
sergey.getAge(); // 30
var sergey = {
age: 30,
getAge: function () {
'use strict';
return this.age;
}
}
var getAge = sergey.getAge;
getAge();
// TypeError:
// Cannot read property
// 'age' of undefined
var block = {
innerHeight: 300,
getHeight: function () {
return this.innerHeight;
}
}
var getHeight = block.getHeight;
getHeight(); // ?
var block = {
innerHeight: 300,
getHeight: function () {
return this.innerHeight;
}
}
var getHeight = block.getHeight;
getHeight(); // 1274
var sergey = {
age: 30,
getAge: function () {
'use strict';
return this.age;
}
}
var oleg = {
age: 23
}
func.call(thisArg, arg1, arg2, ...);
// Заимствуем метод
var getAge = sergey.getAge;
// Безопасно вызываем от лица Олега
getAge.call(oleg); // 23
function func() {
var args =
[].slice.call(arguments);
}
func.apply(thisArg, [arg1, ...]);
var fruits = [];
// Добавляем по одному
fruits.push('Banana');
// Сразу пачкой
fruits.push('Orange', 'Lemon');
var fruits = [];
var citrus = ['Orange', 'Lemon'];
// Добавляем по одному
fruits.push('Banana');
// Сразу массивом
fruits.push.apply(fruits, citrus);
Math.min(3, 5, 2, 6); // 2
var numbers = [3, 5, 2, 6];
Math.min(numbers); // NaN
var numbers = [3, 5, 2, 6];
Math.min.apply(null, numbers); // 2
'use strict';
var person = {
name: 'Sergey',
showItems: function () {
var cb = function (item) {
console.log(this.name + ' have ' + item);
};
['keys', 'phone'].forEach(cb);
}
}
person.showItems(); // TypeError:
// Cannot read property
// 'name' of undefined
'use strict';
var person = {
name: 'Sergey',
showItems: function () {
var _this = this;
var cb = function (item) {
console.log(_this.name + ' have ' + item);
};
['keys', 'phone'].forEach(cb);
}
}
person.showItems();
// Sergey have keys
// Sergey have phone
'use strict'; var person = { name: 'Sergey', showItems: function () { var _this = this; var cb = function (item) { console.log(_this.name + ' have ' + item); }; ['keys', 'phone'] .forEach(cb); } }
showItemsContext = { lexicalEnv: { _this: undefined }, parentLexicalEnv: globalContext.lexicalEnv, this: Ссылка на `person` };
'use strict'; var person = { name: 'Sergey', showItems: function () { var _this = this; var cb = function (item) { console.log(_this.name + ' have ' + item); }; ['keys', 'phone'] .forEach(cb); } }
showItemsContext = { lexicalEnv: { _this: Ссылка на `person` }, parentLexicalEnv: globalContext.lexicalEnv, this: Ссылка на `person` };
'use strict'; var person = { name: 'Sergey', showItems: function () { var _this = this; var cb = function (item) { console.log(_this.name + ' have ' + item); }; ['keys', 'phone'] .forEach(cb); } }
callbackContext = { lexicalEnv: { item: 'keys' }, parentLexicalEnv: showItemsContext.lexicalEnv, this: undefined };
'use strict'; var person = { name: 'Sergey', showItems: function () { var _this = this; var cb = function (item) { console.log(_this.name + ' have ' + item); }; ['keys', 'phone'] .forEach(cb); } }
callbackContext = { lexicalEnv: { item: 'keys' }, parentLexicalEnv: showItemsContext.lexicalEnv, this: undefined };
'use strict';
var person = {
name: 'Sergey',
showItems: function () {
var cb = item => {
console.log(this.name + ' have ' + item);
};
['keys', 'phone'].forEach(cb);
}
}
person.showItems();
// Sergey have keys
// Sergey have phone
'use strict';
var person = {
name: 'Sergey',
showItems: function () {
var cb = function (item) {
console.log(this.name + ' have ' + item);
};
['keys', 'phone'].forEach(cb, this);
}
}
person.showItems();
// Sergey have keys
// Sergey have phone
var bindedFunc = func.bind(thisArg, arg1, ...);
'use strict';
var person = {
name: 'Sergey',
showItems: function () {
var cb = function (item) {
console.log(this.name + ' have ' + item);
};
var bindedCb = cb.bind(this);
['keys', 'phone'].forEach(bindedCb);
}
}
person.showItems();
// Sergey have keys
// Sergey have phone
cb.myBind = function(_this) {
var fn = this;
return function () {
var args = [].slice.call(arguments);
return fn.apply(_this, args);
};
};
var bindedCb = cb.myBind(this);
function User (age) {
return {
age: age,
showAge: function () {
console.log(this.age);
}
}
}
var sergey = new User(30);
sergey.showAge(); // 30
this.close();
window.close();
this.process.version;
global.process.version;
function add(a, b) {
return a + b;
}
var sum = add(2, 5);
var sum = eval('2 + 7');
var person = {
name: 'Sergey',
showName: function () {
return eval('this.name');
}
}
person.showName(); // Sergey
var person = {
name: 'Sergey',
showName: function () {
var evil = eval;
return evil('this.name');
}
}
person.showName(); // ""
// В module.exports кладётся то,
// что будет торчать наружу
module.exports.weeks = 54;
module.exports.days = 366;
// Так как this это module.exports,
// мы можем писать так:
this.isLeap = true;