пошук зменных

Мне было цікава, калі хто-то можа растлумачыць, як працуе Javascript за кулісамі. У гэтым выпадку, пошук зменных. Скажам, у вас ёсць 50 зменных, раскладзеныя на працягу вашага праекта, тут, напрыклад, я проста пералічыць зменныя:

var one;
var two;
var three;
//...
var fifty;

Маё пытанне, калі б я быў заклікаць да fourtythird пераменнага, то яна пачне пошук зменных ад верху да нізу, пакуль яна не знойдзе яе? Так што ў гэтым выпадку пошук будзе праз 42 іншых зменных, пакуль яна не знаходзіць 43 адзін? Калі так, то не было б лепш практыка, каб вызначыць вашы найбольш часта выкарыстоўваюцца зменныя ў верхняй? Калі гэтая тэорыя цалкам няправільна, і гэта гэтак жа можа быць, хто-небудзь яшчэ ведае, як гэта працуе?

Загадзя дзякуй за любую дапамогу, прабачце за цалкам выпадковы пытанне. Дзякуй зноў.

2
SMH @ людзей, якія галасавалі зачыніць, як "не канструктыўна» ...
дададзена аўтар Wesley Murch, крыніца
SMH @ людзей, якія галасавалі зачыніць, як "не канструктыўна» ...
дададзена аўтар Wesley Murch, крыніца
Ёсць папярэджанне вокны [ «fourtythree»]
дададзена аўтар mplungjan, крыніца
Тэорыя можа быць не лепшым, але сам пытанне добры.
дададзена аўтар tymeJV, крыніца
Тэорыя можа быць не лепшым, але сам пытанне добры.
дададзена аўтар tymeJV, крыніца

7 адказы

Тое, што вы просіце з'яўляецца ўнутранай для інтэрпрэтатара. Java-рухавік, хутчэй за ўсё, ёсць табліца, дзе яна можа пошук адрасы з дапамогай ідэнтыфікатара зменнай. Гэта было б маё меркаваньне. Калі вы хочаце, каб паглядзець у яе далей, магчыма, вы можаце знайсці яваскрипт зыходнага кода інтэрпрэтатара, каб убачыць, як гэта выглядае на ідэнтыфікатары зменных.

2
дададзена
ECMAScript, спецыфікацыя вызначае гэта. Для кожнага пераменнага, найменнага звязванне ствараюцца ў адпаведнай лексічнай асяроддзі (ці, больш канкрэтна, у запісе асяроддзя гэтай лексічнай асяроддзя).
дададзена аўтар Šime Vidas, крыніца
@ ŠimeVidas Ok дзіўнае дзякуй. Я ніколі не ўнікаць у спецыфікацыі.
дададзена аўтар dchhetri, крыніца
дададзена аўтар thinklinux, крыніца

Тое, што вы просіце з'яўляецца ўнутранай для інтэрпрэтатара. Java-рухавік, хутчэй за ўсё, ёсць табліца, дзе яна можа пошук адрасы з дапамогай ідэнтыфікатара зменнай. Гэта было б маё меркаваньне. Калі вы хочаце, каб паглядзець у яе далей, магчыма, вы можаце знайсці яваскрипт зыходнага кода інтэрпрэтатара, каб убачыць, як гэта выглядае на ідэнтыфікатары зменных.

2
дададзена
ECMAScript, спецыфікацыя вызначае гэта. Для кожнага пераменнага, найменнага звязванне ствараюцца ў адпаведнай лексічнай асяроддзі (ці, больш канкрэтна, у запісе асяроддзя гэтай лексічнай асяроддзя).
дададзена аўтар Šime Vidas, крыніца
@ ŠimeVidas Ok дзіўнае дзякуй. Я ніколі не ўнікаць у спецыфікацыі.
дададзена аўтар dchhetri, крыніца
дададзена аўтар thinklinux, крыніца

"if I were to call for the fourtythird variable, will it start searching your variables from the top to the bottom till it finds it?" - No, variables are not stored as a list, the Javascript compiler will store those references in an Activation Object for the current execution context. These will be organized in a map structure, so that the lookup for a particular variable will not require iterating through the collection of variables. (With that said, when we look at the implementation of the Javascript compiler from a low-level machine language (lower than C, than one can say that retrieving a reference from a map actually does require some iterating...)

Што тычыцца простага адказу:

Javascript робіць тое, што называецца <�моцны> пераменная пад'ёмная . Не мае значэння, дзе гэта напісана (у той жа вобласці/функцыі), усё гэта будзе ўзняў у верхняй часткі і прызначаную нявызначаную .

function foo() {
    bar();
    var x = 1;
}

на самай справе інтэрпрэтуецца так:

function foo() {
    var x;
    bar();
    x = 1;
}

See this for more explanation: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

2
дададзена
Цвёрды адказ. +1
дададзена аўтар tymeJV, крыніца
Я не думаю, што гэта на самай справе вырашае пытанне. Як я прачытаў, OP пытаецца, калі зменныя захоўваюцца ўсе ў спісе за кулісамі, і пры доступе да FortyThree літаральна падлічвае спіс зменных, пакуль ён не трапляе ў запісе 43-га і выкарыстоўвае значэнне захоўваюцца ў hiddenJavaScriptDataStore [42] .
дададзена аўтар Mathletics, крыніца

"if I were to call for the fourtythird variable, will it start searching your variables from the top to the bottom till it finds it?" - No, variables are not stored as a list, the Javascript compiler will store those references in an Activation Object for the current execution context. These will be organized in a map structure, so that the lookup for a particular variable will not require iterating through the collection of variables. (With that said, when we look at the implementation of the Javascript compiler from a low-level machine language (lower than C, than one can say that retrieving a reference from a map actually does require some iterating...)

Што тычыцца простага адказу:

Javascript робіць тое, што называецца <�моцны> пераменная пад'ёмная . Не мае значэння, дзе гэта напісана (у той жа вобласці/функцыі), усё гэта будзе ўзняў у верхняй часткі і прызначаную нявызначаную .

function foo() {
    bar();
    var x = 1;
}

на самай справе інтэрпрэтуецца так:

function foo() {
    var x;
    bar();
    x = 1;
}

See this for more explanation: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

2
дададзена
Цвёрды адказ. +1
дададзена аўтар tymeJV, крыніца
Я не думаю, што гэта на самай справе вырашае пытанне. Як я прачытаў, OP пытаецца, калі зменныя захоўваюцца ўсе ў спісе за кулісамі, і пры доступе да FortyThree літаральна падлічвае спіс зменных, пакуль ён не трапляе ў запісе 43-га і выкарыстоўвае значэнне захоўваюцца ў hiddenJavaScriptDataStore [42] .
дададзена аўтар Mathletics, крыніца

Адзінае, што мае значэнне пра тое, дзе вы вызначаеце зменныя JavaScript у вобласці бачнасці функцыі. Калі JS рухавік браўзэра разбірае свой код, ён будзе аўтаматычна падымаць вызначэнне зменнай ў пачатак бягучай вобласці.

(function(){
    console.log(somevar);//undefined
    var somevar = 1;
})();

фактычна такі ж, як:

(function(){
    var somevar;
    console.log(somevar);//undefined
    somevar = 1;
})();
1
дададзена

Адзінае, што мае значэнне пра тое, дзе вы вызначаеце зменныя JavaScript у вобласці бачнасці функцыі. Калі JS рухавік браўзэра разбірае свой код, ён будзе аўтаматычна падымаць вызначэнне зменнай ў пачатак бягучай вобласці.

(function(){
    console.log(somevar);//undefined
    var somevar = 1;
})();

фактычна такі ж, як:

(function(){
    var somevar;
    console.log(somevar);//undefined
    somevar = 1;
})();
1
дададзена

Калі ў вас ёсць спіс вар заявы, парадак не мае значэння. Пры спасылцы на зменную ў вашай праграме, то яго значэнне здабываецца па імі непасрэдна.

Лепш за ўсё, каб абвясціць усе зменныя ў верхняй частцы вашых функцый, так як у зменных JavaScript вызначаны ва ўсёй вобласці бачнасці функцыі, нават калі іх адпаведны вар з'яўляецца заяву ў ніжняй частцы функцыі.

0
дададзена