Heim >Web-Frontend >js-Tutorial >Eine kurze Analyse von Funktionsdeklarationen und Funktionsausdrücken - Deklaration von Funktionsdeklarationen im Voraus_Grundkenntnisse

Eine kurze Analyse von Funktionsdeklarationen und Funktionsausdrücken - Deklaration von Funktionsdeklarationen im Voraus_Grundkenntnisse

WBOY
WBOYOriginal
2016-05-16 15:02:231553Durchsuche

Die ersten beiden Tage der Klassenparty waren, abgesehen vom Essen, Trinken, Spaß haben, Schlafen und Reden, wirklich nicht so schön, wie Spaß alleine zu haben, als Spaß zusammen zu haben.

PS: Diejenigen, die ihren Abschluss gemacht haben oder kurz vor dem Abschluss stehen, kommen einfach zusammen, wenn Sie Zeit haben. Nach dem Abschluss wird es zu wenig Zeit geben, um zusammenzukommen.

Jetzt habe ich etwas Zeit, mir einige Dinge anzusehen und einige Dinge zusammenzufassen, und da ich mir vor einiger Zeit Stück für Stück den Funktionsteil von JavaScript angesehen habe, habe ich mir natürlich die Zeit genommen, die relevanten Teile der Funktion zusammenzufassen , einige Teile sind meine eigenen. Wenn mit Ihrem Verständnis etwas nicht stimmt, können Sie es gerne darauf hinweisen.

In diesem Abschnitt werde ich im Voraus auf der Grundlage meines eigenen Verständnisses über die Deklaration von Funktionsdeklarationen sprechen.

Hinweis: An manchen Stellen wird es auch als Funktionsdeklarationsförderung bezeichnet. Die Übersetzung ist unterschiedlich, aber die Bedeutung ist dieselbe, solange sie jeder versteht. Es lebe das Verständnis!

Bevor wir im Voraus über die Deklaration von Funktionsdeklarationen sprechen, müssen einige Methoden zur Funktionsdefinition vorgestellt werden, die den meisten Freunden bekannt sein dürften. Wenn Sie etwas wissen oder nicht wissen möchten, rollen Sie es einfach herunter. Wenn Sie es nicht kennen oder sich damit vertraut machen möchten, machen Sie einfach langsamer und beginnen Sie zu laufen.

So definieren Sie Funktionen

Es gibt drei Hauptmöglichkeiten, Funktionen zu definieren:

1. Funktionsdeklaration
2. Funktionsausdruck)
3.neuer Funktionskonstruktor
Unter diesen werden häufig die Funktionsdefinitionsmethoden Funktionsdeklaration und Funktionsausdruck verwendet. Diese beiden Methoden weisen sehr subtile Unterschiede und Zusammenhänge auf, und die Verwendung dieser beiden Methoden ist auch leicht zu verwechseln. Daher werden in diesem Artikel hauptsächlich diese beiden Methoden zusammengefasst Wissenspunkte zu Funktionsdefinitionsmethoden Das Thema dieses Artikels dreht sich natürlich immer noch um Funktionen im Voraus.

Typisches Format der Funktionsdeklaration:

function functionName(arg1, arg2, ...){
  <!-- function body -->
}

Funktionsausdruck

•Typisches Format des Funktionsausdrucks:

var variable=function(arg1, arg2, ...){
      <!-- function body -->
}

Funktionsausdruck mit Namen (Klammern, Funktionsname):

var variable=function functionName(arg1, arg2, ...){
    <!-- function body -->
}

Funktionsausdrücke mit Namen wie oben können rekursiv verwendet werden:

var variable=function functionName(x){
    if(x<=1)
      return 1;
    else
      return x*functionName(x);
}

Vorabanmeldung

var-Deklaration im Voraus

Jeder sollte im Voraus von der Deklarationserklärung gehört haben, da die Vorabdeklaration einen wichtigen Unterschied zwischen Funktionsdeklaration und Funktionsausdruck darstellt. Es ist wichtig, dass wir diese beiden Funktionsdefinitionsmethoden besser verstehen . wichtige Bedeutung.

Aber bevor wir im Voraus über die Funktionsdeklaration sprechen, müssen wir im Voraus über die Var-Deklaration sprechen.

Geben Sie zunächst die Schlussfolgerung vor der var-Anweisung:

Variablen werden in dem Skript oder der Funktion definiert, in dem sie deklariert werden, und die Anweisung zur Variablendeklaration wird an den Anfang des Skripts oder der Funktion gestellt. Der Variableninitialisierungsvorgang wird jedoch weiterhin am Speicherort der ursprünglichen var-Anweisung ausgeführt, und der Wert der Variablen ist vor der Deklarationsanweisung undefiniert.

Drei einfache Punkte lassen sich aus der obigen Schlussfolgerung zusammenfassen:

1. Die Variablendeklaration wird an den Anfang der Funktion verschoben 2. Nur die Deklaration wird vorangetrieben, die Initialisierung wird nicht vorangetrieben und die Initialisierung wird weiterhin an der ursprünglichen Initialisierungsposition durchgeführt 3. Der Wert der Variablen vor der Deklaration ist undefiniert.

Lassen Sie uns ein Beispiel geben:

var handsome='handsome';
function handsomeToUgly(){
  alert(handsome);
  var handsome='ugly';
  alert(handsome);
}
handsomeToUgly();
Die korrekte Ausgabe lautet:
Zuerst undefiniert ausgeben, dann hässlich ausgeben.


Die falsche Ausgabe ist:

Erst schön aussehend, dann hässlich ausgeben.


Hier ist die Rolle der Variablendeklaration im Voraus. Die schöne lokale Variable wird im gesamten Funktionskörper definiert. Oh nein, sie deckt die schöne globale Variable mit demselben Namen ab, da die Variable im Voraus deklariert wird Weiter zur Funktion. Oben sieht es so aus:


var handsome='handsome';
function handsomeToUgly(){
  var handsome;
  alert(handsome);
  var handsome='ugly';
  alert(handsome);
}
handsomeToUgly();
Also vor Alert(handsome) gibt es bereits eine Var-Beautiful-Aussage, wie oben erwähnt

Der Wert der Variablen vor der Deklaration ist undefiniert

Die erste Ausgabe ist also undefiniert.


Und aus dem oben genannten Grund:

Nur ​​die Deklaration wird erweitert, die Initialisierung wird nicht erweitert und die Initialisierung wird weiterhin an der ursprünglichen Initialisierungsposition durchgeführt

Die zweite Ausgabe ist also hässlich.


Funktionsdeklaration im Voraus

In den nächsten beiden Kapiteln werden wir vorab über die Deklaration von Funktionsdeklarationen in Verbindung mit der var-Deklaration sprechen.


Jeder sollte im Voraus mit der Funktionsdeklaration vertraut sein.

小伙伴们都知道,对于函数声明的函数定义方法,即上面的第一种函数调用方法是正确的,可以输出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(好残酷的现实。。。)。忘了的可以看上面说过的:

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

小了个结

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

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

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn