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

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

WBOY
WBOY원래의
2016-05-16 15:02:231536검색

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

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, ...){bb673d5c66f2af4526aea043e376eb75}是不会提前的,所以函数定义并没有被执行,所以函数表达式不能像函数声明那样进行函数声明提前。

函数声明提前的实例分析

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

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으로 문의하세요.