Жигалов Сергей
// function declaration
function add(a, b) {
return a + b;
}
// function expression
var add = function (a, b) {
return a + b;
}
function greet() {
var text = 'Привет';
text; // 'Привет'
}
text; // ReferenceError:
// text is not defined
┌{ greet }
├─┬{ text }
│ │
│ │
│
│
│
│
function makeCounter() {
var currentCount = 0;
return function () {
return currentCount++;
};
}
┌{ makeCounter } // 1
├─┬{ currentCount } // 2
│ │
│ │
│ ├─┬{ } // 3
│ │ │
│ │
│
class User
{
private int age = 24;
public void ShowAge()
{
Console.WriteLine(this.age);
}
}
static void Main()
{
User mike = new User();
mike.ShowAge(); // 24
}
public class User {
private int age = 24;
public void showAge() {
System.out.println(this.age);
}
}
public static void main(String []args){
User mike = new User();
mike.showAge();
}
function User () {
return {
age: 24,
showAge: function () {
console.log(this.age);
}
}
}
var mike = new User();
mike.showAge(); // 24
this.innerWidth; // 1280
this.process.version; // v7.0.0
function sum(a, b) {
return a + b;
}
sum(1, 2);
┌{ sum } // 1
├─┬{ a, b } // 2
│ │
│ │
│
│
function sum(a, b) {
return a + b;
}
sum(1, 2);
┌{ lE: { sum } }
├─┬{ lE: { a, b } }
│ │
│ │
│
│
function sum(a, b) {
return a + b;
}
sum(1, 2);
┌{ lE: { sum }, this: ??? }
├─┬{ lE: { a, b }, this: ??? }
│ │
│ │
│
│
this.innerWidth; // 1280
window.innerWidth; // 1280
innerWidth; // 1280
this.process.version; // "v7.0.0"
global.process.version; // "v7.0.0"
process.version; // "v7.0.0"
console.log('Hello!');
global.console.log('Hello!');
this.console.log('Hello!');
this === global; // true
// year-2016.js
module.exports.days = 366;
this.isLeapYear = true;
// index.js
var year2016 = require('./year-2016');
year2016.days; // 366;
year2016.isLeapYear; // true;
function getSelf() {
return this;
}
getSelf(); // global
// year-2016.js
module.exports.days = 366;
function getSelf() {
return this;
}
// year-2016.js
module.exports.days = 366;
function getSelf() {
return this;
}
getSelf(); // { days: 366 }
var block = {
innerHeight: 300,
getHeight: function () {
return this.innerHeight;
}
}
???.innerHeight;
var block = {
innerHeight: 300,
getHeight: function () {
return this.innerHeight;
}
}
block.getHeight(); // 300
block.innerHeight;
var block = {
innerHeight: 300,
getHeight: function () {
return this.innerHeight;
}
}
var getHeight = block.getHeight;
???.innerHeight;
var block = {
innerHeight: 300,
getHeight: function () {
return this.innerHeight;
}
}
var getHeight = block.getHeight;
getHeight(); // 1280
window.innerHeight;
Метод call()
вызывает функцию с указанным
значением this и индивидуально предоставленными аргументами.
Function.prototype.call() - JavaScript | MDN
fun.call(thisArg, arg1, arg2, ...);
var mike = {
age: 24,
getAge: function () {
return this.age;
}
}
var anna = {
age: 21
}
???.age;
var mike = {
age: 24,
getAge: function () {
return this.age;
}
}
var anna = {
age: 21
}
mike.getAge.call(anna); // 21
anna.age;
function func() {
var args = Array.prototype.slice.call(arguments);
}
Метод apply()
вызывает функцию с указанным
значением this и аргументами, предоставленными в виде массива.
Function.prototype.apply() - JavaScript | MDN
fun.apply(thisArg, [arg1, arg2]);
Math.min(4, 7, 2, 9); // 2
var arr = [4, 7, 2, 9];
Math.min(arr); // NaN
Math.min.apply(Math, arr); // 2
Math.min.apply(null, arr); // 2
var person = {
name: 'Sergey',
items: ['keys', 'phone', 'banana'],
showItems: function () {
return this.items.map(function (item) {
return this.name + ' has ' + item;
});
}
}
???.items
???.name
var person = {
name: 'Sergey',
items: ['keys', 'phone', 'banana'],
showItems: function () {
return this.items.map(function (item) {
return this.name + ' has ' + item;
});
}
}
person.showItems();
person.items
???.name
var person = {
name: 'Sergey',
items: ['keys', 'phone', 'banana'],
showItems: function () {
return this.items.map(function (item) {
return this.name + ' has ' + item;
});
}
}
person.showItems();
person.items
global.name
'undefined has keys'
'undefined has phone'
'undefined has banana'
var person = {
name: 'Sergey',
items: ['keys', 'phone', 'banana'],
showItems: function () {
var _this = this;
return this.items.map(function (item) {
return _this.name + ' has ' + item;
});
}
}
person.showItems();
┌{ person }
│
│
│
├─┬{ _this }
│ │
│ │
│ ├─┬{ item }
│ │ │
│ │ │
│ │
│
│
│
'Sergey has keys'
'Sergey has phone'
'Sergey has banana'
var person = {
name: 'Sergey',
items: ['keys', 'phone', 'banana'],
showItems: function () {
return this.items.map(function (item) {
return this.name + ' has ' + item;
}, this);
}
}
???.items
???.name
var person = {
name: 'Sergey',
items: ['keys', 'phone', 'banana'],
showItems: function () {
return this.items.map(function (item) {
return this.name + ' has ' + item;
}, this);
}
}
person.showItems();
person.items
person.name
Метод bind()
создаёт новую функцию,
которая при вызове устанавливает в качестве контекста выполнения
this предоставленное значение. <...>
Function.prototype.bind() - JavaScript | MDN
fun.bind(thisArg, arg1, arg2, ...);
var person = {
name: 'Sergey',
items: ['keys', 'phone', 'banana'],
showItems: function () {
return this.items.map(function (item) {
return this.name + ' has ' + item;
}.bind(this));
}
}
???.items
???.name
var person = {
name: 'Sergey',
items: ['keys', 'phone', 'banana'],
showItems: function () {
return this.items.map(function (item) {
return this.name + ' has ' + item;
}.bind(this));
}
}
person.showItems();
person.items
person.name
Function.prototype.myBind = function(_this) {
var fn = this;
var args = [].slice.call(arguments, 1);
return function () {
var curArgs = [].slice.call(arguments);
return fn.apply(_this, args.concat(curArgs));
};
};
Math.pow(2, 3); // 8
Math.pow(2, 10); // 1024
var binPow = Math.pow.bind(null, 2);
binPow(3); // 8
binPow(10); // 1024
function User () {
return {
age: 24,
showAge: function () {
console.log(this.age);
}
}
}
???.age
function User () {
return {
age: 24,
showAge: function () {
console.log(this.age);
}
}
}
var mike = new User();
mike.showAge(); // 24
mike.age
'use strict';
function sum(a, b) {
return a + b;
}
function sum(a, b) {
'use strict';
return a + b;
}
function func() {
var eval = 42; // OK
}
function strictFunc() {
'use strict';
var eval = 42; // SyntaxError
}
function func() {
randomNumber = 4; // OK
}
function strictFunc() {
'use strict';
randomNumber = 4; // ReferenceError
}
function getSelf() {
return this;
}
getSelf(); // global
function getSelf() {
'use strict';
return this;
}
getSelf(); // undefined
var temperature = 12;
eval('temperature + 5'); // 17
var person = {
name: 'Sergey',
showName: function () {
return eval('this.name');
}
}
???.name
var person = {
name: 'Sergey',
showName: function () {
return eval('this.name');
}
}
person.showName(); // Sergey
person.name
var person = {
name: 'Sergey',
showName: function () {
var evil = eval;
return evil('this.name');
}
}
???.name
var person = {
name: 'Sergey',
showName: function () {
var evil = eval;
return evil('this.name');
}
}
person.showName(); // ''
general.name