Rumah > hujung hadapan web > tutorial js > Penjelasan terperinci tentang skop dan rantai skop JS_Pengetahuan asas

Penjelasan terperinci tentang skop dan rantai skop JS_Pengetahuan asas

WBOY
Lepaskan: 2016-05-16 16:05:10
asal
1456 orang telah melayarinya

(1) Skop

Skop pembolehubah ialah kawasan pembolehubah yang ditakrifkan dalam kod sumber program.

1. Skop leksikal digunakan dalam JS

Pembolehubah yang tidak diisytiharkan dalam mana-mana fungsi (var diketepikan dalam fungsi juga dianggap global) dipanggil pembolehubah global (skop global)

Pembolehubah yang diisytiharkan dalam fungsi mempunyai skop fungsi dan merupakan pembolehubah setempat

Pembolehubah setempat mempunyai keutamaan yang lebih tinggi daripada pembolehubah global

Salin kod Kod adalah seperti berikut:

var name="one";
ujian fungsi(){
var name="two";
console.log(nama); //dua
}
ujian();

Mengabaikan var dalam fungsi akan menjejaskan pembolehubah global, kerana ia sebenarnya telah ditulis semula menjadi pembolehubah global

Salin kod Kod adalah seperti berikut:

var name="one";
ujian fungsi(){
nama="dua";
}
ujian();
console.log(nama); //dua

Skop fungsi, iaitu, fungsi ialah unit asas skop js tidak mempunyai skop peringkat blok seperti c/c, seperti jika untuk, dsb.

Salin kod Kod adalah seperti berikut:

ujian fungsi(){
untuk(var i=0;i<10;i ){
Jika(i==5){
      var name = "satu";
}
}
console.log(nama); //satu
}
test(); //Oleh kerana ia adalah skop peringkat fungsi, anda boleh mengakses name="one"

Sudah tentu, fungsi tertib tinggi juga digunakan dalam js, yang sebenarnya boleh difahami sebagai fungsi bersarang

Salin kod Kod adalah seperti berikut:

ujian fungsi1(){
var name = "satu";
Kembalikan fungsi (){
console.log(nama);
}
}
ujian1()();

Selepas test1(), fungsi luar akan dipanggil, dan fungsi dalam akan dikembalikan Kemudian continue(), dan fungsi dalam akan dipanggil dan dilaksanakan dengan sewajarnya, jadi "satu"

akan menjadi output.

Fungsi bersarang melibatkan penutupan, yang akan kita bincangkan kemudian di sini fungsi dalaman boleh mengakses nama pembolehubah yang diisytiharkan dalam fungsi luar, yang melibatkan mekanisme rantai skop

2. Pengisytiharan dalam JS terlebih dahulu

Skop fungsi dalam js bermakna semua pembolehubah yang diisytiharkan dalam fungsi sentiasa kelihatan dalam badan fungsi. Selain itu, pembolehubah boleh digunakan sebelum ia diisytiharkan Keadaan ini dipanggil angkat

petua: Pengisytiharan terlebih dahulu dilakukan apabila enjin js diprasusun Fenomena pengisytiharan terlebih dahulu berlaku sebelum kod dilaksanakan

Contohnya

Salin kod Kod adalah seperti berikut:

var name="one";
ujian fungsi(){
console.log(nama); //undefined
var name="two";
console.log(nama); //dua
}
ujian();

Perkara di atas mencapai kesan berikut

Salin kod Kod adalah seperti berikut:

var name="one";
ujian fungsi(){
nama var;
console.log(nama); //undefined
nama="dua";
console.log(nama); //dua
}
ujian();

Cuba alih keluar var lagi? Ini ialah nama dalam fungsi yang telah menjadi pembolehubah global, jadi ia tidak lagi tidak ditentukan

Salin kod Kod adalah seperti berikut:

var name="one";
ujian fungsi(){
console.log(nama); //satu
nama="dua";
console.log(nama); //dua
}
ujian();

3. Perlu diingat bahawa tiada satu pun daripada parameter yang dinyatakan di atas lulus Bagaimana jika ujian mempunyai parameter?

Salin kod Kod adalah seperti berikut:

ujian fungsi(nama){
console.log(nama); //satu
nama="dua";
console.log(nama); //dua
}
var name = "satu";
ujian(nama);
console.log(nama); // satu

Seperti yang dinyatakan sebelum ini, jenis asas diluluskan mengikut nilai, jadi nama yang diluluskan ke dalam ujian sebenarnya hanyalah salinan ini dikosongkan selepas fungsi kembali.
Jangan fikir nama="two" dalam fungsi menukar nama global, kerana ia adalah dua nama bebas

(2) Rantai skop

Fungsi lanjutan yang dinyatakan di atas melibatkan rantai skop

Salin kod Kod adalah seperti berikut:

ujian fungsi1(){
var name = "satu";
Kembalikan fungsi (){
console.log(nama);
}
}
ujian1()();

1. Perkenalkan perenggan besar untuk menerangkan:
Setiap bahagian kod JavaScript (kod atau fungsi global) mempunyai rantaian skop yang dikaitkan dengannya.

Rantai skop ini ialah senarai atau senarai objek yang dipautkan Kumpulan objek ini mentakrifkan pembolehubah "dalam skop" dalam kod ini.

Apabila js perlu mencari nilai pembolehubah x (proses ini dipanggil resolusi pembolehubah), ia akan bermula dari objek pertama dalam rantaian Jika objek ini mempunyai atribut bernama x, maka nilai atribut ini adalah digunakan secara langsung. Jika tiada atribut bernama x dalam objek pertama, js akan terus mencari objek seterusnya dalam rantai. Jika objek kedua masih tidak mempunyai atribut bernama x, ia akan terus mencari yang seterusnya, dan seterusnya. Jika tiada objek dalam rantai skop mengandungi atribut x, maka x dianggap tidak wujud dalam rantai skop kod ini, dan akhirnya pengecualian ReferenceError dilemparkan.

2. Contoh rangkaian skop:

Dalam kod peringkat atas js (iaitu, kod yang tidak termasuk sebarang definisi fungsi), rantai skop terdiri daripada objek global.

Dalam badan fungsi yang tidak mengandungi sarang, terdapat dua objek pada rantai skop Yang pertama ialah objek yang mentakrifkan parameter fungsi dan pembolehubah setempat, dan yang kedua ialah objek global.

Dalam badan fungsi bersarang, terdapat sekurang-kurangnya tiga objek dalam skop.

3. Peraturan penciptaan rantai skop:

Apabila fungsi ditakrifkan (perhatikan, ia bermula apabila ia ditakrifkan), ia sebenarnya menjimatkan rantai skop.

Apabila fungsi ini dipanggil, ia mencipta objek baharu untuk menyimpan parameter atau pembolehubah setempatnya, menambahkan objek pada rantai skop tersebut dan mencipta perwakilan baharu yang lebih panjang bagi skop panggilan fungsi "rantai".

Untuk fungsi bersarang, keadaan berubah lagi: setiap kali fungsi luaran dipanggil, fungsi dalaman akan ditakrifkan semula semula. Kerana setiap kali fungsi luaran dipanggil, rantai skop adalah berbeza. Fungsi dalaman perlu berbeza secara halus setiap kali ia ditakrifkan - kod fungsi dalam adalah sama setiap kali fungsi luar dipanggil, dan rantai skop yang dikaitkan dengan kod ini juga berbeza.

(petua: Fahami tiga perkara di atas dengan baik dan ingat. Sebaik-baiknya sebut dengan perkataan anda sendiri, jika tidak, anda perlu menghafalnya, kerana penemuduga akan bertanya terus kepada anda: Sila terangkan rantaian skop.. . )

Contoh praktikal rantaian skop:

Salin kod Kod adalah seperti berikut:

var name="one";
ujian fungsi(){
var name="two";
ujian fungsi1(){
var name="tiga";
console.log(nama); //tiga
}
ujian fungsi2(){
console.log(nama); // dua
}
ujian1();
ujian2();
}
ujian();

Di atas ialah fungsi bersarang, dengan itu mesti ada tiga objek dalam rantai skop
Kemudian apabila memanggil, anda perlu mencari nilai nama, hanya cari

pada rantai skop

Apabila test1() berjaya dipanggil, tertibnya ialah test1()->test()-> kerana nilai tiga nama ditemui pada test1(), carian selesai dan mengembalikan

Apabila test1() berjaya dipanggil, susunannya ialah test2()->test()->tetingkap objek global Oleh kerana nilai nama tidak ditemui pada test2(), kami mencarinya dalam test(. ) dan cari jika nilai nama ialah dua, carian akan selesai dan mengembalikan

Contoh lain ialah kadangkala kita melakukan kesilapan dan sering ditipu semasa temuduga.

Salin kod Kod adalah seperti berikut:

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
http://www.w3.org/1999/xhtml">









为什么?
根据作用域链中变量的寻找规则:

复制代码 代码如下:

b.addEventListener("click",function(){
            alarm("Button" i);
        },false);

这里有一个函数,它是匿名函数,既然是函数,那就在作用域链上具有一个对象,这个函数里边使用到了变量i,它自然会在作用域上寻找它.
查找顺序是 这个匿名函数 -->外部的函数buttonInit() -->全局对象window

匿名函数中找不到i,自然跑到了buttonInit(), ok,在for中找到了,

这时注册事件已经结束了,不要以为它会一个一个把i放下来,因为函数作用域之内的变量对作用域内是一直可见的,就是说会保持到最后的状态

当匿名函数要使用i的时候, 注册事件完了, i已经变成了4, 所以都是Button4

那怎么解决呢?

给它传值进去吧, 每次循环时, 再使用一个匿名函数, 把for里边的i传进去, 匿名函数的规则如代码

复制代码 代码如下:

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
http://www.w3.org/1999/xhtml">









这样就可以 Button1..2..3了

4.上述就是作用域链的基本描述,另外,with语句可用于临时拓展作用域链(不推荐使用with)

语法形如:

mit(Objekt)

Erklärung

这个mit语句,将Objekt添加到作用域链的头部,然后执行Anweisung,最后把作用域链恢复到原始状态

简单用法:

比如给表单中各个项的值value赋值

一般可以我们直接这样

复制代码 代码如下:

var f = document.forms[0];
f.name.value = "";
f.age.value = "";
f.email.value = "";

Nach der Einführung von with (da die Verwendung von with eine Reihe von Problemen verursachen wird, verwenden wir daher das obige Formular)

Code kopieren Der Code lautet wie folgt:

with(document.forms[0]){
f.name.value = "";
f.age.value = "";
f.email.value = "";
}

Wenn ein Objekt o außerdem ein x-Attribut hat, ist o.x = 1;
Dann verwenden Sie

Code kopieren Der Code lautet wie folgt:

mit(o){
x = 2;
}

kann in o.x = 2;
umgewandelt werden Wenn o das Attribut x nicht definiert, entspricht seine Funktion lediglich x = 2;

Weil with eine Verknüpfung zum Lesen der Attribute von o bereitstellt, aber keine Attribute erstellen kann, die o selbst nicht hat.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für alle hilfreich sein, die Javascript lernen.

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan