오늘 인터넷에서 JS 함수의 반환값에 대한 기사를 봤습니다. js 함수가 다른 함수를 반환하는 문제에 대해 위에서 언급했고, 인터뷰 질문도 첨부했습니다. 공유하겠습니다
[javascript] view plain copy var add = function(x){ var sum = 1; var tmp = function(x){ sum = sum + x; return tmp; } tmp.toString = function(){ return sum; } return tmp; } // alert(add(1)(2)(3)) --> 6
다음으로, 다른 함수를 반환하는 문제에 대해 자세히 설명하겠습니다.
사실 저는 Java 출신인데, 처음 그 글을 봤을 땐 또 다른 함수를 반환하는 것에 대해 잘 몰랐어요. 뭔가 이상한 게 있어서, 그게 최종 호출 방식이거든요
[javascript] view plain copy
add(1)(2)(3)
Java에서 메소드를 호출하는 함수를 본 적이 없어서 관심을 끌었습니다. 연구를 좀 해보고 공유하겠습니다. 물론, 이미 이에 대해 깊이 이해하고 있다면 건너뛸 수도 있고, 단점에 대해 지적하고 미소를 지을 수도 있습니다. 좋아요, 더 이상 고민하지 말고 본론으로 들어가겠습니다.
가장 간단한 예를 살펴보겠습니다.
[javascript] view plain copy function create1(pro) { console.log("pro : " + pro); return function(obj1, obj2){ console.log(obj1 + " -- " + obj2); return obj1 + obj2; } }
간단한 함수 create1을 만들었고 여기에 반환 값이 있으며 반환 값은 내부 함수입니다. 함수가 빌드된 후 다음으로 호출해 보겠습니다.
[javascript] view plain copy var c1 = create1("pro"); // 创建函数
이전 이해에 따르면 이 메서드를 호출하면 pro: pro가 인쇄되어야 하며 오류가 보고됩니다. 이 글을 읽고 저와 같은 생각을 가지셨다면, 생각이 너무 많으시거나 고정관념을 가지신 것을 축하드리며 웃으세요
. 사실은 위의 코드를 통해 호출하면 로그에는 pro : pro 가 출력되지만 오류는 보고되지 않고 반복적으로 호출한 후에는 동일한 로그만 앞뒤로 출력된다는 것입니다. 이는 또한 이때 create1() 메소드만 입력하고 함수의 내부 함수는 입력하지 않았다는 의미이기도 합니다. 면접 질문에 영감을 받아 한 번 전화해 보았는데, 후속 결과가 인쇄되어 있는 것을 확인했습니다.
[java] view plain copy c1(1, 2); // 调用函数
다음 로그가 출력됩니다. 이는 처음 메소드를 호출할 때 실제로는 내부 함수에 들어가지 않았고, 다시 호출해야만 외부 함수 본문에 들어갈 수 있음을 보여줍니다. 이때 위 호출을 반복하면 내부 레이어의 함수 본체만 호출되고 외부 함수 본체는 호출되지 않습니다.
이와 같은 함수는 다른 함수를 반환합니다. 첫 번째 호출은 외부 함수 본문객체만 작성합니다. 후속 호출만 내부 함수 본문을 호출할 수 있습니다.
걱정하지 마세요. 아직 끝나지 않았습니다. 아직 더 많은 것이 있습니다...
다음으로, 먼저 추가를 수행하는 함수를 선언합니다.
[javascript] view plain copy function infun(obj1, obj2) { console.log(obj1 + " -- " + obj2); return obj1 + obj2; } 然后再声明一个函数,在该函数中调用上面声明的函数: [javascript] view plain copy function create2(pro) { console.log("pro = " + pro); return infun(obj1, obj2); // 这个时候,会报错 }
마지막으로 호출:
[javascript] view plain copy var c1 = create2("pro");
로그 확인:
pro = pro Uncaught ReferenceError: obj1 is not defined
로그를 인쇄한 후 예외가 발생하는 것을 확인할 수 있습니다. 메소드를 일부 변경하면
[javascript] view plain copy function create2(pro) { console.log("pro = " + pro); var obj1 = 1, obj2 = 2; return infun(obj1, obj2); // 这个时候,会报错 }
가 호출되면 정상적으로 실행되는 것으로 확인되고 두 개의 로그 레코드가 인쇄됩니다.
이와 유사하게 함수 내에서 선언된 함수를 반환하는 것은 실제로는 선언된 함수를 호출하는 것으로 위의 상황과는 다르다는 것을 보여줍니다.
자, 이제 되돌아보고 처음의 인터뷰 질문을 자세히 살펴보면 모든 것이 명확하다는 것을 알 수 있습니다.
[javascript] view plain copy // 声明一个函数表达式 var add = function(x){ var sum = 1; // 在函数表达式内部有一个求和的内部函数 var tmp = function(x){ sum = sum + x;// 求和 return tmp; } // 构建一个函数体的toString()函数 tmp.toString = function(){ return sum; } return tmp; // 返回的是一个函数体,如果该函数体有toString()方法,则会调用函数体的toString()方法 }
그럼 통화를 살펴보겠습니다.
[javascript] view plain copy alert(add(1)(2)(3))
결과는 6입니다. 이유는 토론 상황은 동일합니다. 다음으로 반복적으로 호출합니다.
[javascript] view plain copy // 以下结果输出为:6 alert(add(10)(2)(3)) alert(add(100)(2)(3)) // 下面的结果输出变了 alert(add(1)(3)(3)) alert(add(1)(2)(5))
이 사례를 읽은 후 더 흥미로운 정보를 얻으려면 다른 관련 기사를 참조하십시오. PHP 중국어 웹사이트!
관련 읽기:
CSS를 사용하여 이미지 배경의 텍스트 콘텐츠를 숨기는 방법
위 내용은 Js 반환 값 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!