웹 프론트엔드 JS 튜토리얼 함수 선언 및 함수 표현식에 대한 간략한 분석 - 함수 선언 사전 선언_기본 지식

함수 선언 및 함수 표현식에 대한 간략한 분석 - 함수 선언 사전 선언_기본 지식

May 16, 2016 pm 03:02 PM
함수 선언

첫 이틀 동안의 수업 파티는 먹고 마시고 즐기고 자고 이야기하는 것 외에는 함께 즐기는 것보다 혼자 즐기는 것이 정말 즐거웠습니다.

PS: 졸업했거나 졸업예정인 분들은 시간나면 모이세요. 졸업 후에는 모일 시간이 너무 없을 것 같아요.

이제 몇 가지를 살펴보고 몇 가지를 요약하는 시간을 갖게 되었고, 얼마 전에 자바스크립트의 함수 부분을 하나씩 살펴보았기 때문에 함수의 관련 부분을 요약하는 시간을 가졌습니다. , 일부 내용은 제가 이해한 내용입니다. 제가 이해한 내용에 잘못된 부분이 있으면 언제든지 지적해 주시기 바랍니다.

이번 섹션에서는 제가 이해한 바를 바탕으로 함수 선언의 사전 선언에 대해 이야기하겠습니다.

참고: 어떤 곳에서는 이를 함수 선언 승격이라고도 합니다. 번역은 다르지만 모든 사람이 이해하는 한 의미는 동일합니다. 이해 만세!

함수 선언의 선언에 대해 미리 이야기하기 전에, 대부분의 친구들에게 친숙할 몇 가지 함수 정의 방법을 소개할 필요가 있습니다. 알고 있거나 알고 싶지 않다면 굴려보세요. 익숙하지 않거나 익숙해지고 싶다면 속도를 줄여 걷기 시작하세요.

함수 정의 방법

함수를 정의하는 세 가지 주요 방법은 다음과 같습니다.

1. 함수 선언
2. 함수 표현)
3.new 함수 생성자
그 중 함수 선언과 함수 표현의 함수 정의 방법이 자주 사용됩니다. 이 두 가지 방법은 매우 미묘한 차이점과 연관성을 가지고 있으며, 이 두 가지 방법의 사용도 혼동하기 쉽기 때문에 이 기사에서는 관련 있는 두 가지 방법을 주로 요약합니다. 함수 정의 방법에 대한 지식 포인트 물론 이 기사의 주제는 여전히 함수에 관한 것입니다.

함수 선언의 일반적인 형식:

function functionName(arg1, arg2, ...){
  <!-- function body -->
}
로그인 후 복사

함수 표현

•함수 표현의 일반적인 형식:

var variable=function(arg1, arg2, ...){
      <!-- function body -->
}
로그인 후 복사

이름(괄호, 함수 이름)이 포함된 함수 표현식:

var variable=function functionName(arg1, arg2, ...){
    <!-- function body -->
}
로그인 후 복사

위와 같은 이름을 가진 함수 표현식은 재귀적으로 사용할 수 있습니다.

var variable=function functionName(x){
    if(x<=1)
      return 1;
    else
      return x*functionName(x);
}
로그인 후 복사

사전선언

var 선언을 미리

모두가 선언문에 대해 미리 들어봤을 것입니다. 사전 선언은 함수 선언과 함수 표현의 중요한 차이점이기 때문에 여기서 다시 강조하고 싶습니다. . 중요한 의미.

그러나 함수 선언에 대해 이야기하기 전에 var 선언에 대해 먼저 이야기할 필요가 있습니다.

먼저 var 문에 앞서 결론을 내립니다.

변수는 선언된 스크립트나 함수에서 정의되며, 변수 선언문은 스크립트나 함수의 맨 위로 올라갑니다. 그러나 변수 초기화 작업은 여전히 ​​원래 var 문의 위치에서 수행되며 선언문 이전에는 변수 값이 정의되지 않습니다.

위의 결론은 세 가지로 간단하게 요약됩니다.

1. 변수 선언이 함수의 맨 위로 진행됩니다.
2. 선언만 진행되고 초기화는 진행되지 않으며 여전히 원래 초기화 위치에서 초기화가 수행됩니다.
3. 선언 전 변수의 값은 정의되지 않았습니다.

예를 들어보겠습니다:

var handsome='handsome';
function handsomeToUgly(){
  alert(handsome);
  var handsome='ugly';
  alert(handsome);
}
handsomeToUgly();
로그인 후 복사

올바른 출력은 다음과 같습니다.
먼저 정의되지 않은 출력을 출력한 다음 추악한 출력을 출력합니다.

잘못된 출력은 다음과 같습니다.
먼저 멋진 출력을 한 다음 추악한 출력을 출력합니다.

미리 변수를 선언하는 역할이 여기에 있습니다. 핸섬 지역 변수는 함수 본체 전체에 정의되어 있는데, 아뇨, 같은 이름의 핸섬 전역 변수는 미리 선언해 두었기 때문에, 즉 var handsome 입니다. 기능을 상단에 보면 다음과 같습니다.

var handsome='handsome';
function handsomeToUgly(){
  var handsome;
  alert(handsome);
  var handsome='ugly';
  alert(handsome);
}
handsomeToUgly();
로그인 후 복사

그래서 Alert(handsome) 이전에는 위에서 언급한 것처럼 이미 var handsome 문이 있습니다

선언 전 변수의 값이 정의되지 않았습니다
따라서 첫 번째 출력은 정의되지 않았습니다.

위에서 언급한 이유는 다음과 같습니다.

선언만 진행되고 초기화는 진행되지 않고 여전히 원래 초기화 위치에서 초기화가 진행됩니다
그래서 두 번째 출력은 추악합니다.

함수 사전 선언
다음 두 장에서는 var 선언과 함께 함수 선언의 사전 선언에 대해 이야기해 보겠습니다.

누구나 함수 선언에 대해 미리 숙지하고 있어야 합니다. 아주 친숙한 예를 하나 들어보겠습니다.

sayTruth();<!-- 函数声明 -->
function sayTruth(){
  alert('myvin is handsome.');
}

sayTruth();<!-- 函数表达式 -->
var sayTruth=function(){
  alert('myvin is handsome.');
}
로그인 후 복사

小伙伴们都知道,对于函数声明的函数定义方法,即上面的第一种函数调用方法是正确的,可以输出myvin is handsome.的真理,因为函数调用语句可以放在函数声明之后。而对于函数表达式的函数定义方法,即上面的第二种函数调用的方法是不能输出myvin is handsome.的正确结果的。

结合上面的myvin is handsome.例子,函数声明提前的结论似乎很好理解,不就是在使用函数声明的函数定义方法的时候,函数调用可以放在任意位置嘛。对啊,你说的很对啊,小伙伴,我都不知道怎么反驳你了。那就容我再扯几句。

从小伙伴所说的

不就是在使用函数声明的函数定义方法的时候,函数调用可以放在任意位置嘛
可以引出一点:

函数声明提前的时候,函数声明和函数体均提前了。

而且:

函数声明是在预执行期执行的,就是说函数声明是在浏览器准备执行代码的时候执行的。因为函数声明在预执行期被执行,所以到了执行期,函数声明就不再执行(人家都执行过了自然就不再执行了)。

上面是一点。

函数表达式为什么不能声明提前
我们再说一点:为什么函数表达式不能像函数声明那样进行函数声明提前呢?

辛亏我知道一点儿,否则真不知道我该怎么回答呢?

咳咳,按照我的理解给小伙伴们解释一下下:

我们上面说了var的声明提前,注意我上面提过的:

只是声明被提前,初始化不提前,初始化还在原来初始化的位置进行初始化

Ok,我们把函数表达式摆在这看看:

var variable=function(arg1, arg2, ...){
          <!-- function body -->
}
로그인 후 복사

函数表达式就是把函数定义的方式写成表达式的方式(貌似是白说,但是这对于解释和理解为毛函数表达式不能函数声明提前具有良好的疗效),就是把一个函数对象赋值给一个变量,所以我们把函数表达式写成这个样子:

var varible=5看到这,也许小伙伴们会明白了,一个是把一个值赋值给一个变量,一个是把函数对象赋值给一个变量,所以对于函数表达式,变量赋值是不会提前的,即function(arg1, arg2, ...){}是不会提前的,所以函数定义并没有被执行,所以函数表达式不能像函数声明那样进行函数声明提前。

函数声明提前的实例分析

还是那句话,还是例子来的实在:

sayTruth();
if(1){
  function sayTruth(){alert('myvin is handsome')};
}
else{
  function sayTruth(){alert('myvin is ugly')};
}
로그인 후 복사

在浏览器不抛出错误的情况下(请自行测试相应的浏览器是否有抛出错误的情况,为啥我不测试?我能说我懒么。。。),浏览器的输出结果是输出myvin is ugly(我不愿承认,但是事实就是这样啊啊啊啊,难道道出了人丑就该多读书??????)。

为什么呢?当然是声明提前了。因为函数声明提前,所以函数声明会在代码执行前进行解析,执行顺序是这样的,先解析function sayTruth(){alert('myvin is handsome')},在解析function sayTruth(){alert('myvin is ugly')},覆盖了前面的函数声明,当我们调用sayTruth()函数的时候,也就是到了代码执行期间,声明会被忽略,所以自然会输出myvin is ugly(好残酷的现实。。。)。忘了的可以看上面说过的:

函数声明是在预执行期执行的,就是说函数声明是在浏览器准备执行代码的时候执行的。因为函数声明在预执行期被执行,所以到了执行期,函数声明就不再执行了(人家都执行过了自然就不再执行了)。

小了个结

关于函数声明的函数提前(提升)就聊到这里先,希望我的理解和扯淡能够对有需要的小伙伴有所帮助。

当然,实践出真知。对事物的了解、认知和运用还是在于多看多用多总结,记得有句名言,是讲声明和实践的:“动起来,为新的声明喝彩。”。

以上这篇浅析函数声明和函数表达式——函数声明的声明提前就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C++ 함수 선언의 기본 매개변수: 선언 및 사용법에 대한 포괄적인 분석 C++ 함수 선언의 기본 매개변수: 선언 및 사용법에 대한 포괄적인 분석 May 02, 2024 pm 03:09 PM

C++의 기본 매개변수는 함수 매개변수의 기본값을 지정하는 기능을 제공하여 코드 가독성, 단순성 및 유연성을 향상시킵니다. 기본 매개변수 선언: 함수 선언에서 매개변수 뒤에 "=" 기호를 추가하고 그 뒤에 기본값을 추가합니다. 사용법: 함수 호출 시 선택적 매개변수가 제공되지 않으면 기본값이 사용됩니다. 실제 사례: 두 숫자의 합을 계산하는 함수입니다. 한 매개변수는 필수이고 다른 매개변수는 선택사항이며 기본값은 0입니다. 장점: 향상된 가독성, 향상된 유연성, 상용구 코드 감소. 참고: 선언에서만 지정할 수 있고 끝에 있어야 하며 유형이 호환되어야 합니다.

C++ 함수의 선언 및 정의 순서는 어떤 영향을 줍니까? C++ 함수의 선언 및 정의 순서는 어떤 영향을 줍니까? Apr 19, 2024 pm 01:42 PM

C++에서 함수 선언 및 정의의 순서는 컴파일 및 연결 프로세스에 영향을 미칩니다. 가장 일반적인 방법은 선언을 먼저 하고 정의를 나중에 하는 것입니다. 둘 다 동시에 존재하는 경우 "forwarddeclaration"을 사용하여 정의를 배치할 수도 있습니다. 컴파일러는 선언을 무시하고 정의만 사용합니다.

C++ 함수 선언과 정의의 차이점은 무엇입니까? C++ 함수 선언과 정의의 차이점은 무엇입니까? Apr 18, 2024 pm 04:03 PM

함수 선언은 컴파일러에게 함수의 존재를 알리고 유형 검사에 사용되는 구현을 포함하지 않습니다. 함수 정의는 함수 본문을 포함하여 실제 구현을 제공합니다. 주요 구별 기능에는 목적, 위치, 역할이 포함됩니다. 효율적이고 유지 관리가 가능한 C++ 코드를 작성하려면 차이점을 이해하는 것이 중요합니다.

C++ 함수 선언 및 정의 C++ 함수 선언 및 정의 Apr 11, 2024 pm 01:27 PM

C++에서는 함수 선언과 정의가 필요합니다. 함수 선언은 함수의 반환 유형, 이름 및 매개변수를 지정하는 반면, 함수 정의는 함수 본문과 구현을 포함합니다. 먼저 함수를 선언한 다음 필요한 매개변수를 전달하여 프로그램에서 함수를 사용하십시오. return 문을 사용하여 함수에서 값을 반환합니다.

C++ 컴파일 오류: 함수 호출이 함수 선언과 일치하지 않습니다. 어떻게 해결합니까? C++ 컴파일 오류: 함수 호출이 함수 선언과 일치하지 않습니다. 어떻게 해결합니까? Aug 22, 2023 pm 12:39 PM

C++ 컴파일 오류: 함수 호출이 함수 선언과 일치하지 않습니다. 어떻게 해결합니까? C++ 프로그램을 개발할 때 필연적으로 컴파일 오류가 발생합니다. 일반적인 오류 중 하나는 함수 호출이 함수 선언과 일치하지 않는다는 것입니다. 이러한 종류의 오류는 C++ 프로그래머들 사이에 널리 존재합니다. 함수 선언의 정확성에 주의를 기울이지 않기 때문에 컴파일 문제로 이어지며, 이는 결국 문제를 해결하는 데 시간과 에너지를 낭비하고 개발 효율성에 영향을 미칩니다. 이 실수를 피하는 방법은 몇 가지 규범과 표준 관행을 따라야 합니다. 아래에서 살펴보겠습니다. 함수 호출과 함수 선언이란 무엇입니까?

C++ 함수 선언의 [[nodiscard]]: 반환 값 무시의 결과 이해하기 C++ 함수 선언의 [[nodiscard]]: 반환 값 무시의 결과 이해하기 May 01, 2024 pm 06:18 PM

[[nodiscard]] 속성은 함수의 반환 값을 무시해서는 안 된다는 것을 나타냅니다. 그렇지 않으면 초기화되지 않은 예외, 메모리 누수, 잘못된 계산 결과 등의 결과를 방지하기 위해 컴파일러 경고나 오류가 발생합니다.

C++ 함수 선언의 세부 구문: 구문 분석부터 표준 사용법 분석까지 C++ 함수 선언의 세부 구문: 구문 분석부터 표준 사용법 분석까지 Apr 30, 2024 pm 02:54 PM

C++ 함수 선언 구문은 returnTypefunctionName(parameterType1parameterName1,...,parameterTypeNparameterNameN);입니다. 여기서 returnType은 반환 유형이고, functionName은 함수 이름이고, 매개변수 유형은 매개변수 유형이고, 매개변수 이름은 매개변수 이름입니다. 세미콜론.

C++ 함수 선언에 대한 단계별 가이드: 모든 단계를 다루는 자세한 지침 C++ 함수 선언에 대한 단계별 가이드: 모든 단계를 다루는 자세한 지침 May 02, 2024 pm 04:33 PM

함수 선언은 함수 본문을 제공하지 않고 함수가 존재함을 컴파일러에 알려줍니다. 단계는 다음과 같습니다: 함수 반환 유형 지정(반환 값이 없는 경우 무효) 함수 이름 정의 및 함수 매개변수 선언(선택 사항, 데이터 유형 및 식별자 포함) ​​세미콜론

See all articles