anton123 2 years ago
parent
commit
b3ac74b63a
3 changed files with 422 additions and 0 deletions
  1. 97 0
      Замыкания.js
  2. 108 0
      Функции 2/index.html
  3. 217 0
      Функции 2/Функции 2.js

+ 97 - 0
Замыкания.js

@@ -0,0 +1,97 @@
+//makeProfileTimer
+{
+    function makeProfileTimer(){
+        let start = performance.now();
+        return ()=>performance.now()-start
+    }
+    var timer = makeProfileTimer()
+    alert('Замеряем время работы этого alert');  //некий код, время выполнения которого мы хотим измерить с высокой точностью
+    alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(), 
+                    // т. е. измерить время выполнения alert
+}
+
+
+//makeSaver
+{
+    let makeSaver= (param) =>{
+        let i = 0
+        let paramSaved
+        return ()=>{
+            if(i===0){
+                i++
+                return paramSaved=param()
+            }
+            else{
+                return paramSaved
+            }
+        }
+    }
+            
+    
+    
+    var saver = makeSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random 
+                                      // в примере). На этом этапе Math.random НЕ вызывается
+    var value1 = saver()              //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
+    var value2 = saver()              //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную 
+                                      //в makeSaver функцию;
+    value1 === value2                 // всегда true
+
+    var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random()*6)])
+    var value3 = saver2()
+    var value4 = saver2()
+
+    value3 === value4 // тоже должно быть true
+    
+    
+    
+    //let namePrompt = prompt.bind(window, 'Как тебя зовут?')
+    let nameSaver = makeSaver(prompt.bind(window, 'Как тебя зовут?'))
+    alert(`Привет! Prompt еще не было!`)
+    alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
+    alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
+}
+
+
+
+
+
+//myBind
+{
+    function myBind (func,zis,arr){
+        return function (...param){
+            let arr2=[]
+            for(el of arr){
+                    if(typeof el === 'undefined'){
+                       arr2.push(param[0])
+                        param=param.slice(1)
+                    }
+                    else{arr2.push(el)}
+            }
+            return func(...arr2)
+        }
+        
+    }
+
+    var pow5 = myBind(Math.pow, Math, [, 5]) // первый параметр - функция для биндинга значений по умолчанию, 
+                                                  // второй - this для этой функции, третий - массив, в котором undefined означает
+                                                  // параметры, которые должны передаваться при вызове,
+                                                  // а другие значения являются значениями по умолчанию:
+    var cube = myBind(Math.pow, Math, [, 3]) // cube возводит число в куб
+
+    pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
+    cube(3) // => 27
+
+
+    var chessMin = myBind(Math.min, Math, [, 4, , 5,, 8,, 9])
+    chessMin(-1,-5,3,15) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
+
+
+
+    var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt, 
+                                                            // а текст приглашения пользователя задается при вызове zeroPrompt
+    var someNumber = zeroPrompt("Введите число")              // вызывает prompt("Введите число","0")
+
+    const bindedJoiner = myBind((...params) => params.join(''), null, [, 'b', , , 'e', 'f'])//('a','c','d') === 'abcdef'
+    bindedJoiner('a','c','d') === 'abcdef'
+    bindedJoiner('1','2','3') === '1b23ef'
+}

+ 108 - 0
Функции 2/index.html

@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Document</title>
+</head>
+<body>
+    <script>
+        function createPersonClosure(name='Иван', surname='Иванов'){
+
+            let age = 30
+            let fatherName = 'Иванович'
+            let obj
+            return obj = {
+                getName: function (){return name},
+                getSurname: function (){return surname},
+                getFatherName: function (){return fatherName},
+                getAge: function (){return age},
+                getFullName: function (){return `${name} ${surname} ${fatherName} ${age}`},
+
+                setName: function (newName){
+                    if(newName.slice(0,1)===newName.toUpperCase().slice(0,1)){
+                        name=newName
+                        return obj.getName()
+                    }
+                    else{return obj.getName()}
+                },
+                setSurname: function (newSurname){
+                    if(newSurname.slice(0,1)===newSurname.toUpperCase().slice(0,1)){
+                        surname=newSurname
+                        return obj.getSurname()
+                    }
+                    else{return obj.getSurname()}
+                },
+                setFatherName: function (newFatherName){
+                    if(newFatherName.slice(0,1)===newFatherName.toUpperCase().slice(0,1)){
+                        fatherName=newFatherName
+                        return obj.getFatherName()
+                    }
+                    else{return obj.getFatherName()}
+                },
+                setAge: function (newAge){
+                    if(newAge<100 && newAge>0){
+                        age=newAge
+                        return obj.getAge()
+                    }
+                    else{return obj.getAge()}
+                },
+                setFullName: function (newFullName){
+                let [surnameCheck, nameCheck, fatherNameCheck] = newFullName.split(' ')
+                if(nameCheck.slice(0,1)===nameCheck.toUpperCase().slice(0,1) && fatherNameCheck.slice(0,1)===fatherNameCheck.toUpperCase().slice(0,1) && surnameCheck.slice(0,1)===surnameCheck.toUpperCase().slice(0,1)){
+                    [surname, name, fatherName] = newFullName.split(' ')
+                    return obj.getFullName()
+                }
+                else{return obj.getFullName()}
+                } 
+            }
+        } 
+        const b = createPersonClosure()
+        //b.setAge(15)
+        //b.setName("Анна")
+        //b.setSurname("Петрова")
+        //b.setFatherName("Николаевна")
+        b.setFullName("Петрова Анна Николаевна")
+
+        function personForm(parent, person){
+            let inputName = document.createElement('input')
+            let inputSurname = document.createElement('input')
+            let inputFatherName = document.createElement('input')
+            let inputAge = document.createElement('input')
+            let inputFullName = document.createElement('input')
+            inputName.value= person.getName()
+            inputSurname.value= person.getSurname()
+            inputFatherName.value= person.getFatherName()
+            inputAge.value= person.getAge()
+            inputFullName.value= person.getFullName()
+            inputFullName.style.width="220px"
+            parent.append(inputName)
+            parent.append(inputSurname)
+            parent.append(inputFatherName)
+            parent.append(inputAge)
+            parent.append(inputFullName)
+            inputName.oninput = () => {
+                person.setName(inputName.value)
+                inputName.value= person.getName()
+            }
+            inputSurname.oninput = () => {
+                inputSurname.value=person.setSurname(inputSurname.value)
+            }
+            inputFatherName.oninput = () => {
+                inputFatherName.value=person.setFatherName(inputFatherName.value)
+            }
+            inputAge.oninput = () => {
+                inputAge.value=person.setAge(inputAge.value)
+            }
+            inputFullName.oninput = () => {
+                inputFullName.value=person.setFullName(inputFullName.value)
+            }
+        }
+
+        let form = document.createElement('form')
+        document.body.append(form)
+        personForm(form, b)
+    </script>
+</body>
+</html>

+ 217 - 0
Функции 2/Функции 2.js

@@ -0,0 +1,217 @@
+//Arrow to Functions
+//Переведите любые пять заданий из предыдущего ДЗ по функциям в синтаксис function
+
+//Number: temperature 
+{
+    function fahrenheit(x){return x * 1.8 + 32} // функция конвертации из цельсия в фарингейты
+    console.log(fahrenheit(20))//68 градусов по фарингейту
+}
+
+//Flats
+{
+    function flats (apartmentNumber,floorNumber,numberApartmentsFloor){
+        let sumApartments = floorNumber*numberApartmentsFloor// здесь мы узнаем сколько квартир в подьезде
+        let entrance = Math.ceil(apartmentNumber/sumApartments)//номер подьезда
+        let floor = Math.ceil((apartmentNumber%sumApartments)/numberApartmentsFloor)//номер этажа
+        return {entrance,floor}
+    }
+    console.log(flats(65,9,4))//{entrance: 2, floor: 8}
+}
+
+//Credentials
+{
+    function credentials (){
+        let name = prompt("Введите имя").trim().toLowerCase();
+        let surname = prompt("Введите фамилию").trim().toLowerCase();
+        let fatherName = prompt("Введите отчество").trim().toLowerCase();
+        name = name[0].toUpperCase()+name.slice(1);
+        surname = surname[0].toUpperCase()+surname.slice(1);
+        fatherName = fatherName[0].toUpperCase()+fatherName.slice(1);
+        fullName = name+' '+surname+' '+fatherName
+        return {name,surname,fatherName,fullName} 
+    }
+    console.log(credentials())
+}
+
+//New line
+{
+    function newLine (str){
+        let result = (str.split('\\n').join('\n'))
+        return result
+    }
+    console.log(newLine('1 строка\n2 строка'))
+}
+
+//Prompt OR
+{
+    function promptOr(age){
+        age ? alert('Вы ' +(2022 - age)+ ' года рождения!') :alert('Ошибка')
+    }
+    console.log(promptOr(+prompt('Сколько вам лет?')))
+}
+
+//createPerson
+{
+    function createPerson(name, surname){
+        let obj = {
+            'name': name,
+            'surname': surname,
+            getFullName: function (){
+                if(obj.fatherName){
+                    return `${this.name} ${this.fatherName} ${this.surname}`
+                }
+                else{return `${this.name} ${this.surname}`}
+            }
+            }
+            return obj   
+    }
+
+    const a = createPerson("Вася", "Пупкин")
+    const b = createPerson("Анна", "Иванова")
+    const c = createPerson("Елизавета", "Петрова")
+
+    console.log(a.getFullName()) //Вася Пупкин
+    a.fatherName = 'Иванович'    
+    console.log(a.getFullName())//Вася Иванович Пупкин
+    console.log(b.getFullName()) //Анна Иванова
+}
+
+//createPersonClosure
+{
+    function createPersonClosure(name, surname){
+
+        let age 
+        let fatherName 
+        let obj
+        return obj = {
+            getName: function (){return name},
+            getSurname: function (){return surname},
+            getFatherName: function (){return fatherName},
+            getAge: function (){return age},
+            getFullName: function (){return `${name} ${surname} ${fatherName} ${age}`},
+
+            setName: function (newName){
+                if(newName.slice(0,1)===newName.toUpperCase().slice(0,1)){
+                    name=newName
+                    return obj.getName()
+                }
+                else{return obj.getName()}
+            },
+            setSurname: function (newSurname){
+                if(newSurname.slice(0,1)===newSurname.toUpperCase().slice(0,1)){
+                    surname=newSurname
+                    return obj.getSurname()
+                }
+                else{return obj.getSurname()}
+            },
+            setFatherName: function (newFatherName){
+                if(newFatherName.slice(0,1)===newFatherName.toUpperCase().slice(0,1)){
+                    fatherName=newFatherName
+                    return obj.getFatherName()
+                }
+                else{return obj.getFatherName()}
+            },
+            setAge: function (newAge){
+                if(newAge<100 && newAge>0){
+                    age=newAge
+                    return obj.getAge()
+                }
+                else{return obj.getAge()}
+            },
+            setFullName: function (newFullName){
+            let [surnameCheck, nameCheck, fatherNameCheck] = newFullName.split(' ')
+            if(nameCheck.slice(0,1)===nameCheck.toUpperCase().slice(0,1) && fatherNameCheck.slice(0,1)===fatherNameCheck.toUpperCase().slice(0,1) && surnameCheck.slice(0,1)===surnameCheck.toUpperCase().slice(0,1)){
+                [surname, name, fatherName] = newFullName.split(' ')
+                return obj.getFullName()
+            }
+            else{return obj.getFullName()}
+            } 
+        }
+    } 
+
+    const a = createPersonClosure("Вася", "Пупкин")
+    const b = createPersonClosure("Анна", "Иванова")
+    console.log(a.getName())
+    a.setAge(15)
+    a.setAge(150) //не работает
+
+    b.setFullName("Петрова Анна Николаевна")
+    console.log(b.getFatherName()) //Николаевна
+}
+
+//createPersonClosureDestruct
+{
+    function createPersonClosureDestruct(person){
+        let {name='Иван',surname='Иванов',fatherName='Иванович',age=30}=person
+        let obj
+        return obj = {
+            getName: function (){return name},
+            getSurname: function (){return surname},
+            getFatherName: function (){return fatherName},
+            getAge: function (){return age},
+            getFullName: function (){return `${name} ${surname} ${fatherName} ${age}`},
+
+            setName: function (newName){
+                if(newName.slice(0,1)===newName.toUpperCase().slice(0,1)){
+                    name=newName
+                    return obj.getName()
+                }
+                else{return obj.getName()}
+            },
+            setSurname: function (newSurname){
+                if(newSurname.slice(0,1)===newSurname.toUpperCase().slice(0,1)){
+                    surname=newSurname
+                    return obj.getSurname()
+                }
+                else{return obj.getSurname()}
+            },
+            setFatherName: function (newFatherName){
+                if(newFatherName.slice(0,1)===newFatherName.toUpperCase().slice(0,1)){
+                    fatherName=newFatherName
+                    return obj.getFatherName()
+                }
+                else{return obj.getFatherName()}
+            },
+            setAge: function (newAge){
+                if(newAge<100 && newAge>0){
+                    age=newAge
+                    return obj.getAge()
+                }
+                else{return obj.getAge()}
+            },
+            setFullName: function (newFullName){
+            let [surnameCheck, nameCheck, fatherNameCheck,] = newFullName.split(' ')
+            if(nameCheck.slice(0,1)===nameCheck.toUpperCase().slice(0,1) && fatherNameCheck.slice(0,1)===fatherNameCheck.toUpperCase().slice(0,1) && surnameCheck.slice(0,1)===surnameCheck.toUpperCase().slice(0,1)){
+                [fatherName=fatherName, surname=surname, name=name, age=age] = newFullName.split(' ')
+                return obj.getFullName()
+            }
+            else{return obj.getFullName()}
+            } 
+        }
+    } 
+}
+
+
+//isSorted
+{
+    function isSorted(...arr){
+        arr = arr.map((a,b)=>a>b?a:false)
+        for(el of arr){
+            typeof el === 'number'?el=el:arr=false
+            }
+            if(typeof arr==='object'){
+                arr=true
+            }
+            return arr
+    }
+    //Test isSorted
+    let arr = []
+    let el
+    while (el=+prompt('Добавьте элемент в массив')) {
+        arr.push(el)
+    }
+    isSorted(arr)
+}
+
+//personForm
+//personForm в index.html