JS 함수 및 역할 영역 문제

8397 단어

1. 함수 표현식을 즉시 실행하는 것은 무엇입니까?무슨 작용이 있느냐


함수 표현식은
  • 익명 함수를 성명합니다
  • 이 익명 함수를 즉시 실행하세요

  • 일반적인 쓰기 방법: (function () {alert ('익명 함수')} ()
    왜 한 쌍의 괄호로 익명 함수를 싸야 합니까?괄호를 넣지 않고 function () {alert ('익명 함수')} () 로 쓰면 오류가 발생합니다. function 키워드가 줄에 나타나서 일률적으로 문장으로 해석되기 때문입니다.따라서 자바스크립트 엔진은 줄의 첫 번째가 function 키워드인 것을 보고 이 단락은 함수의 정의이며 괄호로 끝내서는 안 된다고 생각해서 잘못 보고했습니다.해결 방법은 function이 줄에 나타나지 않도록 하는 것이다. 따라서 물건을 추가할 수 있다. 다음과 같은 방법이 있다.
    (function(){alert(' ')} ()) //  
    (function(){alert(' ')}) () // 
    !function(){alert(' ')}() //  , , 。
    +function(){alert(' ')}()
    -function(){alert(' ')}()
    ~function(){alert(' ')}()
    void function(){alert(' ')}()
    new function(){alert(' ')}()
    

    그러면 함수 표현식을 즉각 집행하는 것은 어떤 작용을 합니까?역할은 독립된 역할 영역을 만드는 것입니다.이 작용역 안의 변수는 바깥에 접근할 수 없기 때문에 변수 오염을 피할 수 있다

    2. 제발!,귀속으로 실현하다

    function recursion(n) {
      if (n === 1) {
        return 1;
      }
      return n * recursion(n-1);
    }
    var result = recursion(10);  
    console.log(result);     // n 10 , :3628800
    

    3. 다음 코드는 무엇을 출력합니까?

    function getInfo(name, age, sex){
        console.log('name:',name);
        console.log('age:', age);
        console.log('sex:', sex);
        console.log(arguments);
        arguments[0] = 'valley';
        console.log('name', name);
    }
    
    getInfo(' ', 2, ' ');
    getInfo(' ', 3);
    getInfo(' ');
    

    get Info('굶주린 계곡', 2,'남') 출력 호출:
    name:  
    age: 2
    sex:  
    [" ",2," "]
    name valley
    

    getInfo 호출('작은 골짜기', 3) 출력
    name:  
    age: 3
    sex: undefined
    [" ",3]
    name valley
    

    getInfo('남') 출력 호출:
    name:  
    age: undefined
    sex: undefined
    [" "]
    name valley
    

    주: 1.함수에 매개 변수를 전송할 때는 순서대로 전송하고, 매개 변수가 없으면 undefined입니다.2. 함수 내부에서arguments 대상을 사용하여 이 함수에 전송된 모든 매개 변수를 얻을 수 있다

    4. 함수를 써서 매개 변수의 제곱을 되돌려줍니까?

    function sumOfSquares() {
      var squaresSum= 0
      var paraNum = arguments.length
      for (var i = 0; i < paraNum; i++) {
        squaresSum = squaresSum + arguments[i]*arguments[i]
      }
      return squaresSum
    }
    var result = sumOfSquares(2,3,4)
    var result2 = sumOfSquares(1,3)
    console.log(result)  //29
    console.log(result2)  //10
    

    주:arguments.length는 실삼에 전입된 개수를 대표한다

    5. 아래 코드의 출력은?무엇 때문에

    console.log(a);
    var a = 1;
    console.log(b);
    

    출력:
    undefined
    error(b is not defined)
    

    주: JS에서 변수 성명이 앞당겨지기 때문에 상기 코드는
    var a
    console.log(a);   //undefined
    a = 1;
    console.log(b);   // ,error
    

    6. 다음 코드의 출력은?무엇 때문에

    sayName('world');
    sayAge(10);
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };
    

    출력:
    hello world
    error(sayAge is not a function)
    

    주: JS의 함수 성명은 변수 성명과 마찬가지로 앞당겨지기 때문에 상기 코드는
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge
    sayName('world');          // hello world
    sayAge(10);                // ,sayAge 
    sayAge = function(age){
        console.log(age);
    };
    

    7. 다음 코드는 무엇을 출력합니까?무엇 때문에

    var x = 10
    bar() 
    function foo() {
      console.log(x)
    }
    function bar(){
      var x = 30
      foo()
    }
    

    출력 결과: 10 이유: 1.우선foo()와bar() 함수의 성명이 앞당겨지기 때문에bar()는 정상적으로 실행할 수 있습니다.이어서 bar () 는 foo () 를 호출했고, foo () 는 x 3을 출력했습니다.foo() 함수 내부에서 x 변수를 찾지 못했습니다. 이때 JS는 이 함수가 있는 역할을 설명하는 영역에서 찾아 위로 올라갑니다. (위 코드에서 가장 바깥쪽에 있는 x, 즉 10)

    8. 다음 코드는 무엇을 출력합니까?무엇 때문에

    var x = 10;
    bar() 
    function bar(){
      var x = 30;
      function foo(){
        console.log(x) 
      }
      foo();
    }
    

    출력 결과: 30 이유와 같이foo()가 표시하는 작용역의 x의 값은 30

    9. 다음 코드는 무엇을 출력합니까?무엇 때문에

    var a = 1
    function fn1(){
      function fn2(){
        console.log(a)
      }
      function fn3(){
        var a = 4
        fn2()
      }
      var a = 2
      return fn3
    }
    var fn = fn1()
    fn() // 
    

    출력 결과: 2 이유 동제 7, fn2 () 성명이 있는 작용역의 a의 값은 2

    10. 다음 코드는 무엇을 출력합니까?무엇 때문에

    var a = 1
    function fn1(){
      function fn3(){
        var a = 4
        fn2()
      }
      var a = 2
      return fn3
    }
    function fn2(){
      console.log(a)
    }
    var fn = fn1()
    fn() // 
    

    출력 결과: 1 이유 동제 7, fn2 () 성명이 있는 작용역의 a의 값은 1

    11. 다음 코드는 무엇을 출력합니까?무엇 때문에

    var a = 1
    function fn1(){
    
      function fn3(){
        function fn2(){
          console.log(a)
        }
        fn2()
        var a = 4
      }
      var a = 2
      return fn3
    }
    var fn = fn1()
    fn() // 
    

    출력 결과는 다음과 같다. undefined 이 문제는 특히 주의해야 한다. 이 문제와 위의 차이점은 변수가 앞당겨져서 fn2()의 집행은 a변수가 성명한 후에 값을 부여하기 전(a는 이때 성명만 하고 값을 부여하지 않았기 때문에 undefined), 즉 함수 fn3의 실제 집행은 다음과 같다.
      function fn3(){
        function fn2(){
          console.log(a)
        }
        var a
        fn2()
        a = 4
      }
    

    12. 다음 코드는 무엇을 출력합니까?무엇 때문에

    var obj1 = {a:1, b:2};
    var obj2 = {a:1, b:2};
    console.log(obj1 == obj2);
    console.log(obj1 = obj2);
    console.log(obj1 == obj2);
    

    출력:
    false
    {a: 1, b: 2}
    true
    

    이유: 대상의 상등, 그들의 인용이 메모리의 같은 구역을 가리킬 때만 상등하다. 즉, 그들이 창고 메모리에 있는 인용 주소가 같은obj1과obj2는 각각 두 개의 다른 대상 인용이다. 그 안에 저장된 주소는 다르다. 즉, 그들이 가리키는 구역은 다르다. 실시간 구역의 내용은 같고 같지 않기 때문에obj1=obj2를 통해obj2에 저장된 주소를obj1에게 부여한 후에obj1과obj2는 같은 구역을 가리키기 때문에 마지막에 둘은 같다

    13. 다음 코드는 무엇을 출력합니까?무엇 때문에

    var a = 1
    var c = { name: 'jirengu', age: 2 }
    
    function f1(n){
      ++n
    }
    function f2(obj){
      ++obj.age
    }
    
    f1(a) 
    f2(c) 
    f1(c.age) 
    console.log(a) 
    console.log(c) 
    

    출력:
    1
    {name: "jirengu", age: 3}
    

    이유: a는 실삼으로 f1의 형삼 n에게 전달되었는데 a의 값을 n에게 부여한 다음에 +n, 그리고 n의 값을 2로 바꾸는 것과 같다. a의 값은 여전히 1c로 실삼으로 f2의 형삼 obj에 전달되었다. c는 하나의 대상이다. 그 안에 저장된 것은 그 안에 있는 내용이 있는 메모리 구역의 주소를 가리키고 f2에서 이 주소가 가리키는 메모리 구역 안의age를 전++로 한다.그래서 이 메모리 영역에서age의 실제 값을 바꾸었다. 즉age는 마지막에 3을 얻어 c.age를 실참으로 f1의 형삼 n에게 전달했고 여전히age를 하나의 값으로 n에게 부여했다. age 자체의 주를 바꾸지 않았다. 값의 전달은 그 자체를 바꿀 수 없고 인용된 전달이 있어야 한다.

    14. 딥 카피 함수 쓰기


    얕은 복사: 문자열 유형에 대해 얕은 복사는 값에 대한 복사이고 대상에 대해 얕은 복사는 대상 주소에 대한 복사이며 새로운 창고를 열지 않았다. 즉, 복사의 결과는 두 대상이 같은 주소를 가리키고 그 중의 한 대상의 속성을 수정하면 다른 대상의 속성도 바뀐다.얕은 복사본의 경우 하위 객체와 하위 객체 아래의 객체가 모두 공용됩니다.간단한 복제 구현 함수:
    var oldObject = {name:" ",
                     age:25,
                     sex:" ",
                     city:" ",
                     wife:{name:" ", sex:" ", age:24, city:" "},
                     friends:[" ", " ", " "]
                     }
    function shallowCopy(oldObj) {
      var newObj = {}
      for (var i in oldObj) {
        if (oldObj.hasOwnProperty(i)) {  //hasOwnProperty() ( ) 。 , true, false
          newObj[i] = oldObj[i]
        }
      }
      return newObj
    }
    var newObject = shallowCopy(oldObject)
    console.log(newObject)                                 //newObject oldObject 
    console.log(newObject.wife == oldObject.wife)          //true 
    console.log(newObject.friends == oldObject.friends)     //true, true newObject , oldObject                       
    

    깊은 복사: 깊은 복사는 새로운 창고를 개척하는 것이다. 두 대상은 두 개의 서로 다른 주소, 즉 더미 속의 서로 다른 공간을 가리키며 한 대상의 속성을 수정하면 다른 대상의 속성을 바꾸지 않는다.심층 복사는 하위 객체와 하위 객체 아래의 객체를 복제하며 새 객체와 이전 객체는 공통 영역이 아닙니다.딥 카피 구현 함수:
    var oldObject = {name:" ",
                     age:25,
                     sex:" ",
                     city:" ",
                     wife:{name:" ", sex:" ", age:24, city:" "},
                     friends:[" ", " ", " "]
                     }
    function deepCopy(oldObj) {
      var newObj = {}
      for (var key in oldObj) {
        if (typeof oldObj[key] === 'object') {
          newObj[key] = deepCopy(oldObj[key])  // 
        } else {
          newObj[key] = oldObj[key]   // 
        }
      }
      return newObj
    }
    var newObject = deepCopy(oldObject)
    console.log(newObject)                                 //newObject oldObject 
    console.log(newObject.wife == oldObject.wife)          //false
    console.log(newObject.friends == oldObject.friends)     //false, false newObject , oldObject   
    

    자바스크립트의 깊은 복사와 얕은 복사에 대한 대답을 참고하시겠습니까?무엇이 즉시 실행 함수입니까?무슨 작용이 있습니까?

    좋은 웹페이지 즐겨찾기