ජාවාස්ක්‍රිප්ට් හි විචල්‍යයන්ගේ විෂය පථය කුමක්ද?


2022

ජාවාස්ක්‍රිප්ට් හි විචල්‍යයන්ගේ විෂය පථය කුමක්ද? ශ්‍රිතයකට පරිබාහිරව ඔවුන් තුළ එකම විෂය පථයක් තිබේද? නැත්නම් එය පවා වැදගත්ද? එසේම, විචල්‍යයන් ගෝලීයව නිර්වචනය කර ඇත්නම් ඒවා ගබඩා කරන්නේ කොහේද?



9
මෙන්න එය ඉතා සියුම් ලෙස පැහැදිලි කරන ලිපියක්. ජාවාස්ක්‍රිප්ට් විචල්‍ය විෂය පථය ගැන ඔබ දැනගත යුතු සියල්ල
සෞරබ් පරාක්

2
මෙම කලින් සඳහන් කරන කයිල් සිම්ප්සන් ඊ-පොත Github කියවීමට ලබා ගත හැකි වන අතර, එය මෙය බැලීම සදහා ඔබට JavaScript විෂය පථ සහ බඳුන්වලට පිළිබඳව දැන ගැනීමට අවශ්ය සියලු ඔබ පවසනවා. ඔබට එය මෙතැනින් සොයාගත හැකිය: github.com/getify/You-Dont-Know-JS/blob/master/… එය "ඔබ නොදන්නා JS" පොත් මාලාවේ කොටසකි , එය දැන ගැනීමට කැමති සෑම කෙනෙකුටම විශිෂ්ටයි JavaScript ගැන වැඩි විස්තර.
3rik82

Answers:


2545

ටීඑල්ඩීආර්

ජාවාස්ක්‍රිප්ට් සතුව ශබ්දකෝෂ (ස්ථිතික ලෙසද හැඳින්වේ) විෂය පථය සහ වසා දැමීම් ඇත. මෙයින් අදහස් කරන්නේ ප්‍රභව කේතය බැලීමෙන් ඔබට හඳුනාගැනීමේ විෂය පථය පැවසිය හැකි බවයි.

විෂය පථ හතර නම්:

  1. ගෝලීය - සෑම දෙයකින්ම පෙනේ
  2. ශ්‍රිතය - ශ්‍රිතයක් තුළ දෘශ්‍යමාන වේ (සහ එහි උප කාර්යයන් සහ කොටස්)
  3. වාරණය - බ්ලොක් එකක් තුළ දැකිය හැකිය (සහ එහි උප කොටස්)
  4. මොඩියුලය - මොඩියුලයක් තුළ දැකිය හැකිය

ගෝලීය සහ මොඩියුලයේ විෂය පථයට පිටතින්, විචල්‍යයන් ප්‍රකාශයට පත් කරනුයේ var(ශ්‍රිත විෂය පථය), let(වාරණ විෂය පථය) සහ const(වාරණ විෂය පථය) භාවිතා කරමිනි . අනන්‍යතා ප්‍රකාශනයේ වෙනත් බොහෝ ආකාරවල දැඩි මාදිලියේ වාරණ විෂය පථයක් ඇත.

දළ විශ්ලේෂණය

විෂය පථය යනු හඳුනාගැනීමේ යන්ත්‍රයක් වලංගු වන කේත පදනමේ කලාපයයි.

ශබ්දකෝෂ පරිසරයක් යනු හඳුනාගැනීමේ නම් සහ ඒවා හා සම්බන්ධ අගයන් අතර සිතියම්ගත කිරීමකි.

විෂය පථය සෑදී ඇත්තේ ශබ්දකෝෂ පරිසරවල සම්බන්ධිත කැදැල්ලකිනි, කැදැල්ලේ සෑම මට්ටමක්ම මුතුන් මිත්තන්ගේ ution ාතන සන්දර්භයක ශබ්දකෝෂ පරිසරයකට අනුරූප වේ.

මෙම සම්බන්ධිත ශබ්දකෝෂ පරිසරයන් විෂය පථයක් “දාමයක්” සාදයි. හැඳුනුම් විභේදනය යනු ගැලපෙන හඳුනාගැනීමක් සඳහා මෙම දාමය ඔස්සේ සෙවීමේ ක්‍රියාවලියයි.

හඳුනාගැනීමේ විභේදනය සිදුවන්නේ එක් දිශාවකට පමණි: පිටතට. මේ ආකාරයට පිටත ශබ්දකෝෂ පරිසරයන්ට අභ්‍යන්තර ශබ්දකෝෂ පරිසරයන්ට “නොපෙනේ”.

ජාවාස්ක්‍රිප්ට් හි හඳුනාගැනීමේ විෂය පථය තීරණය කිරීමේදී අදාළ සාධක තුනක් තිබේ :

  1. හඳුනාගැනීමක් ප්‍රකාශයට පත් කළ ආකාරය
  2. එහිදී හඳුනාගැනීමක් ප්‍රකාශයට පත් කරන ලදි
  3. ඔබ දැඩි මාදිලියේ හෝ දැඩි නොවන මාදිලියේ සිටියත්

හඳුනාගැනීම් ප්‍රකාශ කළ හැකි ක්‍රම කිහිපයක්:

  1. var, letසහconst
  2. ක්‍රියාකාරී පරාමිතීන්
  3. බ්ලොක් පරාමිතිය අල්ලා ගන්න
  4. ක්‍රියාකාරී ප්‍රකාශන
  5. නම් කරන ලද ශ්‍රිත ප්‍රකාශන
  6. ගෝලීය වස්තුවෙහි ව්‍යංගයෙන් අර්ථ දක්වා ඇති ගුණාංග (එනම්, varදැඩි නොවන ආකාරයෙන් මඟ හැරීම )
  7. import ප්‍රකාශ
  8. eval

සමහර ස්ථාන හඳුනාගැනීම් ප්‍රකාශ කළ හැකිය:

  1. ගෝලීය සන්දර්භය
  2. ක්‍රියාකාරී ශරීරය
  3. සාමාන්‍ය වාරණය
  4. පාලන ව්‍යුහයක මුදුන (උදා: ලූප්, නම්, යනාදිය)
  5. ව්‍යුහය පාලනය කරන්න
  6. මොඩියුල

ප්‍රකාශන ශෛලීන්

var

ගෝලීය සන්දර්භය තුළ කෙලින්ම ප්‍රකාශයට පත් කරන ලද ඒවා හැරුණු විට ඒවා භාවිතා කරන var බව ප්‍රකාශ කරන හඳුනාගැනීම් වලට ක්‍රියාකාරී විෂය පථයක් ඇත. evalකාර්යයන් සඳහා ඒවායේ භාවිතය සඳහා වෙනම නීති තිබේ .

ඉඩ දෙන්න

හදුනාගැනීම් ගෝලීය සන්දර්භය තුළ කෙලින්ම ප්‍රකාශයට පත් කරන විට හැරුණු විට ඒවාට ගෝලීය විෂය පථය ඇති බව හැරුණු විට ඒවා භාවිතා කර ප්‍රකාශයට පත් කර ඇති letඅතර const ඒවා අවහිර කිරීමේ විෂය පථයක් ඇත.

සටහන: let, constසහ var සියලු එසෙව්වා ඇත . මෙයින් අදහස් කරන්නේ ඔවුන්ගේ තාර්කික අර්ථ දැක්වීමේ පිහිටීම ඔවුන්ගේ වටපිටාවේ (අවහිර හෝ ක්‍රියාකාරිත්වය) ඉහළින්ම ඇති බවයි. කෙසේ වෙතත්, විචල්ය useing ප්රකාශ letහා constපාලනය මූල ෙක්ත ප්රකාශය අවස්ථාවක සම්මත තෙක් කියවීමට හෝ පවරා ගත නොහැක. අන්තර් කාල පරිච්ඡේදය තාවකාලික මළ කලාපය ලෙස හැඳින්වේ.

function f() {
    function g() {
        console.log(x)
    }
    let x = 1
    g()
}
f() // 1 because x is hoisted even though declared with `let`!

ක්‍රියාකාරී පරාමිති නම්

ක්‍රියාකාරී පරාමිති නම් ශ්‍රිත ශරීරයට පරාසයක පවතී. මේ සඳහා සුළු සංකීර්ණතාවයක් ඇති බව සලකන්න. පෙරනිමි තර්ක ලෙස ප්‍රකාශයට පත් කරන ලද කාර්යයන් පරාමිති ලැයිස්තුවට වඩා සමීප වන අතර එය ශ්‍රිතයේ සිරුර නොවේ.

ක්‍රියාකාරී ප්‍රකාශන

ක්‍රියාකාරී ප්‍රකාශනවල දැඩි මාදිලියේ වාරණ විෂය පථය සහ දැඩි නොවන මාදිලියේ ක්‍රියාකාරී විෂය පථය ඇත. සටහන: දැඩි නොවන මාදිලිය යනු විවිධ බ්‍රව්සර්වල විචක්ෂණශීලී historical තිහාසික ක්‍රියාත්මක කිරීම් මත පදනම් වූ සංකීර්ණ පැන නගින නීති මාලාවකි.

නම් කරන ලද ශ්‍රිත ප්‍රකාශන

නම් කරන ලද ශ්‍රිත ප්‍රකාශන තමන්ටම පරික්ෂා කර ඇත (උදා: පුනරාවර්තනය සඳහා).

ගෝලීය වස්තුවෙහි ව්‍යංගයෙන් අර්ථ දක්වා ඇති ගුණාංග

දැඩි නොවන මාදිලියේදී, ගෝලීය වස්තුවෙහි ව්‍යංගයෙන් අර්ථ දක්වා ඇති ගුණාංගවලට ගෝලීය විෂය පථයක් ඇත, මන්ද ගෝලීය වස්තුව විෂය පථයේ ඉහළින් පිහිටා ඇති බැවිනි. දැඩි ආකාරයෙන් මේවාට අවසර නැත.

eval

දී evalනූල්, විචල්ය භාවිතා ප්රකාශ varනම්, වර්තමාන විෂය තැන්පත් වේ, හෝ evalගෝලීය වස්තුවක් මත ගුණ ලෙස, වක්ර අයුරින් භාවිත කෙරේ.

උදාහරණ

පහත දැක්වෙන්නේ නම් x, yසහ zශ්‍රිතයෙන් පිටත කිසිදු අර්ථයක් නොමැති නිසා ReferenceError එකක් විසි කරයි f.

function f() {
    var x = 1
    let y = 1
    const z = 1
}
console.log(typeof x) // undefined (because var has function scope!)
console.log(typeof y) // undefined (because the body of the function is a block)
console.log(typeof z) // undefined (because the body of the function is a block)

පහත සඳහන් සඳහා ReferenceError පිලෙන් yහා z, නමුත් සඳහා xපිළිබඳ ජනතාවගේ නිසා x, වාරණ අවහිරතා නැත. පාලන ව්‍යුහයන්ගේ සිරුරු නිර්වචනය කරන බ්ලොක් if, ඒ forහා whileසමානව ක්‍රියා කරයි.

{
    var x = 1
    let y = 1
    const z = 1
}
console.log(x) // 1
console.log(typeof y) // undefined because `y` has block scope
console.log(typeof z) // undefined because `z` has block scope

පහත දැක්වෙන්නේ, ක්‍රියාකාරී විෂය පථය ඇති xබැවින් ලූපයෙන් පිටත දෘශ්‍යමාන වේ var:

for(var x = 0; x < 5; ++x) {}
console.log(x) // 5 (note this is outside the loop!)

... මෙම හැසිරීම නිසා ඔබ varලූප භාවිතා කර ප්‍රකාශයට පත් කරන ලද විචල්‍යයන් වැසීම ගැන සැලකිලිමත් විය යුතුය . මෙහි xප්‍රකාශිත විචල්‍යයේ එක් අවස්ථාවක් පමණක් ඇති අතර එය තාර්කිකව ලූපයෙන් පිටත වාඩි වී සිටී.

පහත දැක්වෙන මුද්‍රණ 5, පස් වතාවක්, ඉන්පසු පිටත ලූපය 5සඳහා හයවන වරටත් මුද්‍රණය console.logකරයි:

for(var x = 0; x < 5; ++x) {
    setTimeout(() => console.log(x)) // closes over the `x` which is logically positioned at the top of the enclosing scope, above the loop
}
console.log(x) // note: visible outside the loop

පහත දැක්වෙන මුද්‍රණ අවහිර කර ඇති undefinedනිසා x. ඇමතුම් ආපසු එකින් එක ක්‍රියාත්මක වේ. සඳහා නව හැසිරීම letනම් වෙනස් විචල්ය එක් එක් නිර්නාමික කාර්යය පමණ වසා බව විචල්ය මාර්ගයෙන් x(එය සිදු වනු ඇත මෙන් නොව var), සහ ඒ නිසා පූර්ණ සංඛ්යා 0හරහා 4මුද්රණය කර ඇත .:

for(let x = 0; x < 5; ++x) {
    setTimeout(() => console.log(x)) // `let` declarations are re-declared on a per-iteration basis, so the closures capture different variables
}
console.log(typeof x) // undefined

ReferenceErrorදෘශ්‍යතාව අවහිරයෙන් xසීමා නොවන නිසා පහත සඳහන් දෑ විසි නොකරනු ඇත ; කෙසේ වෙතත්, එය මුද්‍රණය කරනු undefinedලබන්නේ විචල්‍යය ආරම්භ කර නොමැති නිසා ( ifප්‍රකාශය නිසා).

if(false) {
    var x = 1
}
console.log(x) // here, `x` has been declared, but not initialised

forභාවිතයෙන් letලූපයක මුදුනේ ප්‍රකාශිත විචල්‍යයක් ලූපයේ සිරුරට පරික්ෂා කෙරේ:

for(let x = 0; x < 10; ++x) {} 
console.log(typeof x) // undefined, because `x` is block-scoped

ReferenceErrorදෘශ්‍යතාව xඅවහිරය මගින් සීමා කර ඇති නිසා පහත සඳහන් දෑ විසි කරයි :

if(false) {
    let x = 1
}
console.log(typeof x) // undefined, because `x` is block-scoped

භාවිතයෙන් ප්‍රකාශයට පත් කරන ලද විචල්‍යයන් var, letහෝ constසියල්ල මොඩියුලවලට පරික්ෂා කර ඇත:

// module1.js

var x = 0
export function f() {}

//module2.js

import f from 'module1.js'

console.log(x) // throws ReferenceError

පහත දැක්වෙන්නේ ගෝලීය වස්තුව මත දේපලක් ප්‍රකාශයට පත් කරනු ඇත, මන්ද varගෝලීය සන්දර්භය තුළ භාවිතා කරන ලෙස ප්‍රකාශයට පත් කරන ලද විචල්‍යයන් ගෝලීය වස්තුවට ගුණාංග ලෙස එකතු කරනු ලැබේ:

var x = 1
console.log(window.hasOwnProperty('x')) // true

letහා constගෝලීය සන්දර්භය තුළ ගෝලීය වස්තුව දේපළ එකතු කරන්නේ නැහැ, නමුත් තවමත් ගෝලීය විෂය පථය ඇති:

let x = 1
console.log(window.hasOwnProperty('x')) // false

ක්‍රියාකාරී ශරීරයේ ක්‍රියාකාරී පරාමිතීන් ප්‍රකාශයට පත් කළ හැකි යැයි සැලකිය හැකිය:

function f(x) {}
console.log(typeof x) // undefined, because `x` is scoped to the function

කැච් බ්ලොක් පරාමිතීන් ඇල්ලීමේ බ්ලොක් ශරීරයට පරික්ෂා කර ඇත:

try {} catch(e) {}
console.log(typeof e) // undefined, because `e` is scoped to the catch block

නම් කරන ලද ශ්‍රිත ප්‍රකාශන ප්‍රකාශනයට පමණක් සීමා වේ:

(function foo() { console.log(foo) })()
console.log(typeof foo) // undefined, because `foo` is scoped to its own expression

දැඩි නොවන මාදිලියේදී, ගෝලීය වස්තුවෙහි ව්‍යංගයෙන් අර්ථ දක්වා ඇති ගුණාංග ගෝලීය වශයෙන් විෂය පථයට අයත් වේ. දැඩි ප්‍රකාරයේදී ඔබට දෝෂයක් ඇති වේ.

x = 1 // implicitly defined property on the global object (no "var"!)

console.log(x) // 1
console.log(window.hasOwnProperty('x')) // true

දැඩි නොවන මාදිලියේදී, ශ්‍රිත ප්‍රකාශයන්ට ශ්‍රිත විෂය පථය ඇත. දැඩි ප්‍රකාරයේදී ඔවුන්ට වාරණ විෂය පථයක් ඇත.

'use strict'
{
    function foo() {}
}
console.log(typeof foo) // undefined, because `foo` is block-scoped

එය කබාය යටතේ ක්‍රියා කරන ආකාරය

විෂය පථය යනු හඳුනාගැනීමේ යන්ත්‍රයක් වලංගු වන කේතයේ ශබ්දකෝෂ කලාපයයි.

ජාවාස්ක්රිප්ට්, සෑම උත්සවය-වස්තුව සැඟවුණු ඇත [[Environment]]මෙම සැඳහුම බව සඳහන් lexical පරාසය පරිසරය පිළිබඳ ක්රියාත්මක සන්දර්භය එය නිර්මාණය කරන ලද තුළ (අඩුක්කුව රාමුව).

ඔබ ශ්‍රිතයක් ඉල්ලා සිටින විට, සැඟවුණු [[Call]]ක්‍රමය හැඳින්වේ. මෙම ක්‍රමය මඟින් නව ක්‍රියාත්මක කිරීමේ සන්දර්භයක් නිර්මාණය කරන අතර නව ක්‍රියාත්මක කිරීමේ සන්දර්භය සහ ශ්‍රිත වස්තුවෙහි ශබ්දකෝෂ පරිසරය අතර සම්බන්ධයක් ඇති කරයි. එය සිදු කරන්නේ [[Environment]]ශ්‍රිත-වස්තුවෙහි අගය නව ක්‍රියාත්මක කිරීමේ සන්දර්භයේ ශබ්දකෝෂ පරිසරය පිළිබඳ බාහිර යොමු ක්ෂේත්‍රයකට පිටපත් කිරීමෙනි .

නව ක්‍රියාත්මක කිරීමේ සන්දර්භය සහ ශ්‍රිත වස්තුවේ ශබ්දකෝෂ පරිසරය අතර මෙම සම්බන්ධතාවය වසා දැමීමක් ලෙස හැඳින්වෙන බව සලකන්න .

මේ අනුව, ජාවාස්ක්‍රිප්ට් හි විෂය පථය ක්‍රියාත්මක වන්නේ බාහිර යොමු කිරීම් මගින් “දාමයක” එකට බැඳී ඇති ශබ්දකෝෂ පරිසරයන් හරහා ය. මෙම ශබ්දකෝෂ පරිසරය විෂය පථය ලෙස හැඳින්වෙන අතර, හඳුනාගැනීමේ විභේදනය සිදුවන්නේ ගැලපෙන හඳුනාගැනීමක් සඳහා දාමය සෙවීමෙනි.

වැඩි විස්තර සොයන්න .


280
විස්තීර්ණ වීමට ආසන්න නැත, නමුත් මෙය සමහර විට නවීන ජාවාස්ක්‍රිප්ට් effectively ලදායී ලෙස කියවීමට පවා අවශ්‍ය විය යුතු ජාවාස්ක්‍රිප්ට් විෂය පථ උපක්‍රම වේ.
ට්‍රිප්ටිච්

148
ඉහළ ශ්‍රේණිගත පිළිතුරක්, එයට හේතුව කුමක්දැයි විශ්වාස නැත. එය නිසි පැහැදිලි කිරීමකින් තොරව නිදසුන් සමූහයක් පමණක් වන අතර, පසුව මූලාකෘති උරුමය (එනම් දේපල විභේදනය) විෂය පථය (එනම් විචල්‍ය විභේදනය) සමඟ පටලවා ගන්නා බවක් පෙනේ. විෂය පථය සහ දේපල නිරාකරණය පිළිබඳ සවිස්තරාත්මක (හා නිවැරදි) පැහැදිලි කිරීමක් comp.lang.javascript නිති අසන ප්‍රශ්න සටහන් වල ඇත.
රොබ්

109
@RobG එය ඉහළ ශ්‍රේණිගත කර ඇත්තේ එය පුළුල් පරාසයක ක්‍රමලේඛකයන්ට ප්‍රයෝජනවත් සහ තේරුම් ගත හැකි බැවිනි. ඔබ පළ කර ඇති සබැඳිය සමහර වෘත්තිකයන්ට ප්‍රයෝජනවත් වන අතර අද ජාවාස්ක්‍රිප්ට් ලියන බොහෝ දෙනෙකුට තේරුම්ගත නොහැකිය. පිළිතුර සංස්කරණය කිරීමෙන් නාමකරණ ගැටළු විසඳීමට නිදහස් වන්න.
ට්‍රිප්ටිච්

7
@ triptych - මම පිළිතුරු සංස්කරණය කරන්නේ ප්‍රධාන දේ නොව සුළු දේවල් නිවැරදි කිරීමට පමණි. "විෂය පථය" "දේපල" ලෙස වෙනස් කිරීම දෝෂය නිවැරදි කරනු ඇත, නමුත් ඉතා පැහැදිලි වෙනසකින් තොරව උරුමය සහ විෂය පථය මිශ්‍ර කිරීමේ ගැටළුව නොවේ.
RobG

24
ඔබ පිටත විෂය පථයේ විචල්‍යයක් නිර්වචනය කර, if ප්‍රකාශයක් මඟින් ශ්‍රිතය තුළ එකම නමක් සහිත විචල්‍යයක් අර්ථ දක්වන්නේ නම්, එම ශාඛාව ළඟා නොවුනත් එය නැවත අර්ථ දැක්වේ. උදාහරණයක් - jsfiddle.net/3CxVm
ක්‍රිස් එස්

234

දී ඇති ශ්‍රිතයක් සඳහා විෂය පථය ස්ථාපිත කිරීම සඳහා ජාවාස්ක්‍රිප්ට් විෂය පථ දාම භාවිතා කරයි. සාමාන්‍යයෙන් එක් ගෝලීය විෂය පථයක් ඇති අතර, අර්ථ දක්වා ඇති සෑම ශ්‍රිතයකටම එයටම ආවේණික වූ විෂය පථයක් ඇත. වෙනත් ශ්‍රිතයක් තුළ අර්ථ දක්වා ඇති ඕනෑම ශ්‍රිතයකට දේශීය ශ්‍රිතයක් ඇති අතර එය බාහිර ශ්‍රිතයට සම්බන්ධ වේ. එය සෑම විටම විෂය පථය නිර්වචනය කරන ප්‍රභවයේ පිහිටීමයි.

විෂය පථයේ දාමයක් මූලික වශයෙන් එහි මව් විෂය පථයට දර්ශකයක් සහිත සිතියමකි.

විචල්‍යයක් නිරාකරණය කිරීමේදී, ජාවාස්ක්‍රිප්ට් අභ්‍යන්තරයේ විෂය පථයෙන් ආරම්භ වී පිටතට සොයයි.


1
විෂය පථ දාමය යනු [මතකය] වැසීම සඳහා වන තවත් යෙදුමකි ... මෙහි කියවන අයට ඉගෙන ගැනීමට / ජාවාස්ක්‍රිප්ට් ලබා ගැනීමට.
නිව් ඇලෙක්සැන්ඩ්‍රියා

109

ගෝලීය වශයෙන් ප්‍රකාශයට පත් කරන ලද විචල්‍යයන්ට ගෝලීය විෂය පථයක් ඇත. ශ්‍රිතයක් තුළ ප්‍රකාශයට පත් කරන ලද විචල්‍යයන් එම ශ්‍රිතයට අනුරූප වන අතර එකම නමින් ගෝලීය විචල්‍යයන් සෙවනැල්ල කරයි.

(සැබෑ ජාවාස්ක්‍රිප්ට් ක්‍රමලේඛකයින්ට වෙනත් පිළිතුරු වලින් පෙන්වා දීමට හැකි වනු ඇති බව මට විශ්වාසයි. විශේෂයෙන් ඕනෑම වේලාවක හරියටම අදහස් කරන්නේ කුමක්ද යන්න පිළිබඳව මම මෙම පිටුව හරහා පැමිණියෙමි this. ඔබ ආරම්භ කිරීමට මෙම හඳුන්වාදීමේ සබැඳිය ප්‍රමාණවත් යැයි සිතමි .)


7
මෙම ප්‍රශ්නයට පිළිතුරු දීමට පවා මම බිය වෙමි. නියම ජාවාස්ක්‍රිප්ට් ක්‍රමලේඛකයෙකු ලෙස, පිළිතුර කොතරම් ඉක්මනින් ලබා ගත හැකිදැයි මම දනිමි. ලස්සන ලිපි.
ට්‍රිප්ටිච්

10
Rip ට්‍රිප්ටිච්: දේවල් අතපසු වීම ගැන ඔබ අදහස් කරන්නේ කුමක්දැයි මම දනිමි, නමුත් කරුණාකර කෙසේ හෝ පිළිතුරක් එක් කරන්න. මම සෙවුම් කිහිපයක් කිරීමෙන් ඉහත විය ... සැබෑ අත්දැකීම් සහිත කෙනෙකු විසින් ලියන ලද පිළිතුර ඇත බැඳී වඩා හොඳ විය. කරුණාකර මගේ පිළිතුර නිවැරදි කරන්න.
ජෝන් ස්කීට්

4
කෙසේ හෝ ජෝන් ස්කීට්, ස්ටැක් පිටාර ගැලීම පිළිබඳ මගේ වඩාත් ජනප්‍රිය පිළිතුරට වගකිව යුතුය.
ට්‍රිප්ටිච්

75

පැරණි පාසල ජාවාස්ක්‍රිප්ට්

සාම්ප්‍රදායිකව, ජාවාස්ක්‍රිප්ට් සතුව ඇත්තේ විෂය පථ දෙකක් පමණි:

  1. ගෝලීය විෂය පථය : යෙදුම ආරම්භයේ සිටම (*) විචල්‍යයන් යෙදුම පුරා දනී .
  2. ක්‍රියාකාරී විෂය පථය : ශ්‍රිතයේ ආරම්භයේ සිටම විචල්‍යයන් ප්‍රකාශයට පත් කරනු ලැබේ .

වෙනස පැහැදිලි කරන තවත් බොහෝ පිළිතුරු දැනටමත් ඇති බැවින් මම මේ ගැන විස්තර නොකරමි.


නවීන ජාවාස්ක්‍රිප්ට්

මෙම වඩාත් ම මෑත JavaScript උපැස් දැන් ද තුන්වන විෂය පථය ඉඩ:

  1. අවහිර කිරීමේ විෂය පථය : හඳුනාගැනීම් ඔවුන් තුළ ප්‍රකාශයට පත් කර ඇති විෂය පථයේ ඉහළින්ම "දන්නා" නමුත් ඒවා ප්‍රකාශයට පත් වූ රේඛාව අවසන් වන තුරු ඒවා පැවරීමට හෝ නොසලකා හැරීමට (කියවීමට) නොහැකිය. මෙම අන්තර් කාල පරිච්ඡේදය "තාවකාලික මළ කලාපය" ලෙස හැඳින්වේ.

බ්ලොක් විෂය පථ විචල්‍යයන් නිර්මාණය කරන්නේ කෙසේද?

සාම්ප්‍රදායිකව, ඔබ ඔබේ විචල්‍යයන් මේ ආකාරයෙන් නිර්මාණය කරයි:

var myVariable = "Some text";

බ්ලොක් විෂය පථ විචල්‍යයන් මේ ආකාරයෙන් නිර්මාණය වේ:

let myVariable = "Some text";

ඉතින් ක්‍රියාකාරී විෂය පථය සහ වාරණ විෂය පථය අතර වෙනස කුමක්ද?

ක්‍රියාකාරී විෂය පථය සහ වාරණ විෂය පථය අතර වෙනස අවබෝධ කර ගැනීම සඳහා පහත කේතය සලකා බලන්න:

// i IS NOT known here
// j IS NOT known here
// k IS known here, but undefined
// l IS NOT known here

function loop(arr) {
    // i IS known here, but undefined
    // j IS NOT known here
    // k IS known here, but has a value only the second time loop is called
    // l IS NOT known here

    for( var i = 0; i < arr.length; i++ ) {
        // i IS known here, and has a value
        // j IS NOT known here
        // k IS known here, but has a value only the second time loop is called
        // l IS NOT known here
    };

    // i IS known here, and has a value
    // j IS NOT known here
    // k IS known here, but has a value only the second time loop is called
    // l IS NOT known here

    for( let j = 0; j < arr.length; j++ ) {
        // i IS known here, and has a value
        // j IS known here, and has a value
        // k IS known here, but has a value only the second time loop is called
        // l IS NOT known here
    };

    // i IS known here, and has a value
    // j IS NOT known here
    // k IS known here, but has a value only the second time loop is called
    // l IS NOT known here
}

loop([1,2,3,4]);

for( var k = 0; k < arr.length; k++ ) {
    // i IS NOT known here
    // j IS NOT known here
    // k IS known here, and has a value
    // l IS NOT known here
};

for( let l = 0; l < arr.length; l++ ) {
    // i IS NOT known here
    // j IS NOT known here
    // k IS known here, and has a value
    // l IS known here, and has a value
};

loop([1,2,3,4]);

// i IS NOT known here
// j IS NOT known here
// k IS known here, and has a value
// l IS NOT known here

මෙහිදී, අපගේ විචල්‍යය jප්‍රථම වරට ලූප සඳහා පමණක් දන්නා නමුත් පෙර සහ පසු නොවන බව අපට පෙනේ . එහෙත්, අපගේ විචල්‍යය iසමස්ත ශ්‍රිතය තුළම දනී.

තවද, බ්ලොක් ස්කොප් විචල්‍යයන් ප්‍රකාශයට පත් කිරීමට පෙර නොදන්නා බව සලකන්න. එකම බ්ලොක් විෂය පථය එකම බ්ලොක් තුළ නැවත ප්‍රකාශ කිරීමට ඔබට අවසර නැත. මෙය බ්ලොක් ස්කොප් විචල්‍යයන් ගෝලීයව හෝ ක්‍රියාකාරීව විෂය පථයට වඩා අඩු දෝෂයක් ඇති කරයි, ඒවා ඔසවා ඇති අතර බහු ප්‍රකාශන වලදී කිසිදු දෝෂයක් ඇති නොවේ.


අද බ්ලොක් විෂය පථ විචල්‍යයන් භාවිතා කිරීම ආරක්ෂිතද?

අද භාවිතා කිරීම ආරක්ෂිතද නැද්ද යන්න ඔබගේ පරිසරය මත රඳා පවතී:

  • ඔබ සේවාදායක පැත්තේ ජාවාස්ක්‍රිප්ට් කේතය ( Node.js ) ලියන්නේ නම් , ඔබට ආරක්ෂිතව letප්‍රකාශය භාවිතා කළ හැකිය .

  • ඔබ සේවාදායක පාර්ශවීය ජාවාස්ක්‍රිප්ට් කේතයක් ලියන්නේ නම් සහ බ්‍රව්සර් මත පදනම් වූ ට්‍රාන්ස්පෝලර් ( ට්‍රේසර් හෝ බාබල්- ස්ටැන්ඩලෝන් වැනි ) භාවිතා කරන්නේ නම්, ඔබට ආරක්ෂිතව letප්‍රකාශය භාවිතා කළ හැකිය , කෙසේ වෙතත් ඔබේ කේතය කාර්ය සාධනය සම්බන්ධයෙන් ප්‍රශස්ත විය හැකි නමුත් ඕනෑම දෙයක් විය හැකිය.

  • ඔබ සේවාදායක පාර්ශවීය ජාවාස්ක්‍රිප්ට් කේතයක් ලියන්නේ නම් සහ නෝඩ් මත පදනම් වූ ට්‍රාන්ස්පෝලර් භාවිතා කරන්නේ නම් ( ට්‍රේසර් ෂෙල් ස්ක්‍රිප්ට් හෝ බාබෙල් වැනි ), ඔබට එම letප්‍රකාශය ආරක්ෂිතව භාවිතා කළ හැකිය . ඔබේ බ්‍රව්සරය දැනගන්නේ සම්ප්‍රේෂණය කළ කේතය ගැන පමණක් බැවින්, කාර්ය සාධන අඩුපාඩු සීමිත විය යුතුය.

  • ඔබ සේවාදායක පාර්ශවීය ජාවාස්ක්‍රිප්ට් කේතයක් ලියන්නේ නම් සහ ප්‍රවාහකයෙකු භාවිතා නොකරන්නේ නම්, ඔබ බ්‍රව්සරයේ සහාය සලකා බැලිය යුතුය.

    මේවා කිසිසේත් සහාය නොදක්වන බ්‍රව්සර් කිහිපයකි let:

    • අන්තර්ජාල ගවේෂක 10 සහ ඊට පහළ
    • ෆයර්ෆොක්ස් 43 සහ ඊට පහළ
    • සෆාරි 9 සහ ඊට පහළ
    • ඇන්ඩ්‍රොයිඩ් බ්‍රව්සරය 4 සහ ඊට පහළ
    • ඔපෙරා 27 සහ ඊට පහළ
    • චෝම් 40 සහ ඊට පහළ
    • ඔපෙරා මිනි සහ බ්ලැක්බෙරි බ්‍රව්සරයේ ඕනෑම සංස්කරණයක්

රූප විස්තරය මෙහි ඇතුළත් කරන්න


බ්‍රව්සර් සහාය පිළිබඳ සටහන් තබා ගන්නේ කෙසේද

ඔබ letමෙම පිළිතුර කියවන අවස්ථාවේදී ප්‍රකාශයට සහාය දක්වන බ්‍රව්සර් පිළිබඳ යාවත්කාලීන දළ විශ්ලේෂණයක් සඳහා , මෙම Can I Useපිටුව බලන්න .


(*) ජාවාස්ක්‍රිප්ට් විචල්‍යයන් එසවීම නිසා ඒවා ප්‍රකාශයට පත් කිරීමට පෙර ගෝලීයව හා ක්‍රියාකාරීව විෂය පථයන් ආරම්භ කර භාවිතා කළ හැකිය . මෙයින් අදහස් කරන්නේ ප්‍රකාශන සෑම විටම විෂය පථයට ඉහළින් ඇති බවයි.


2
"නොදන්නා" නොමඟ යවන සුළුය, මන්දයත් එසවීම හේතුවෙන් විචල්‍යය එහි ප්‍රකාශයට පත් වේ.
ඔරියෝල්

ඉහත උදාහරණය නොමඟ යවන සුළුය, විචල්යයන් 'i' සහ 'j' අවහිරයෙන් පිටත නොදනී. 'ඉඩ' විචල්‍යයන්ට විෂය පථය ඇත්තේ එම විශේෂිත කොටසෙහි පමණක් නොවේ. අපට වෙනත් වාසි ද ඇත, ඔබට විචල්‍යය නැවත ප්‍රකාශ කළ නොහැකි අතර එය ශබ්දකෝෂ විෂය පථය රඳවා තබා ගනී.
zakir

1
මෙය ප්‍රයෝජනවත් විය, ස්තූතියි! "නූතන ජාවාස්ක්‍රිප්ට්" සහ "පැරණි පාසල් ජාවාස්ක්‍රිප්ට්" යන්නෙන් ඔබ අදහස් කරන දේ පිළිබඳව නිශ්චිතව පැවසීම ඊටත් වඩා ප්‍රයෝජනවත් වනු ඇතැයි මම සිතමි; මම හිතන්නේ මේවා පිළිවෙලින් ECMAScript 6 / ES6 / ECMAScript හා කලින් අනුවාද වලට අනුරූපද?
ජෝන් ෂ්නයිඩර්

1
On ජෝන්ස්නයිඩර්: නිවැරදි! මම "පැරණි පාසැල් ජාවාස්ක්‍රිප්ට්" යැයි පවසන තැන, මම ECMAScript 5 ගැන කතා කරන අතර "නවීන ජාවාස්ක්‍රිප්ට්" ගැන සඳහන් කරන තැන මම ECMAScript 6 (හෝ ECMAScript 2015) ගැන කතා කරමි. බොහෝ දෙනා දැන ගැනීමට අවශ්‍ය පරිදි (1) බ්ලොක් විෂය පථය සහ ක්‍රියාකාරී විෂය පථය අතර ඇති වෙනස කුමක්ද, (2) බ්ලොක් විෂය පථයට සහය දක්වන බ්‍රව්සර් සහ (3) ඔවුන් වැඩ කරන ඕනෑම ව්‍යාපෘතියක් සඳහා අද වාරණ විෂය පථය භාවිතා කිරීම ආරක්ෂිතද යන්න. ඒ නිසා මම මගේ පිළිතුර එම ගැටළු විසඳීම කෙරෙහි යොමු කළා.
ජෝන් ස්ලෙගර්ස්

1
On ජෝන්ස්නයිඩර්: (න්) කෙසේවෙතත්, පසුගිය වසර කිහිපය තුළ ජාවාස්ක්‍රිප්ට් වෙත එකතු කර ඇති අංග මොනවාද යන්න පිළිබඳ වැඩිදුර දැන ගැනීමට කැමති අය සඳහා මම ඊඑස් 6 / ඊඑස් 2015 පිළිබඳ ස්මාෂිං සඟරා ලිපියකට සබැඳියක් එක් කළෙමි ... වෙනත් ඕනෑම අයෙකුගේ "නවීන ජාවාස්ක්‍රිප්ට්" සමඟ මා අදහස් කරන්නේ කුමක්දැයි කල්පනා කරනවා විය හැකිය.
ජෝන් ස්ලෙගර්ස්

39

මෙන්න උදාහරණයක්:

<script>

var globalVariable = 7; //==window.globalVariable

function aGlobal( param ) { //==window.aGlobal(); 
                            //param is only accessible in this function
  var scopedToFunction = {
    //can't be accessed outside of this function

    nested : 3 //accessible by: scopedToFunction.nested
  };

  anotherGlobal = {
    //global because there's no `var`
  }; 

}

</script>

වසා දැමීම් සහ පුද්ගලික සාමාජිකයන් සෑදීමට ඒවා භාවිතා කරන්නේ කෙසේද යන්න විමර්ශනය කිරීමට ඔබට අවශ්‍ය වනු ඇත .



26

"ජාවාස්ක්‍රිප්ට් 1.7" (මොසිල්ලා ජාවාස්ක්‍රිප්ට් වෙත දිගුව) තුළ කෙනෙකුට letප්‍රකාශය සමඟ බ්ලොක්-ස්කොප් විචල්‍යයන් ප්‍රකාශ කළ හැකිය :

 var a = 4;
 let (a = 3) {
   alert(a); // 3
 }
 alert(a);   // 4

2
ඔව්, නමුත් එය භාවිතා කිරීම ආරක්ෂිතද? මගේ කේතය වෙබ්කිට් තුළ ක්‍රියාත්මක වන්නේ නම් මම යථාර්ථවාදීව මෙම ක්‍රියාත්මක කිරීම තෝරා ගන්නේද?
ඉගෝර්ගනාපොල්ස්කි

10
Y පයිතන්: නැත, වෙබ්කිට් සහාය නොදක්වයි let.
kennytm

සමාගම් අභ්‍යන්තර පද්ධතියක් වැනි සියලුම සේවාදායකයින් මොසිල්ලා බ්‍රව්සරයක් භාවිතා කරනු ඇතැයි ඔබ දැන සිටියේ නම් මේ සඳහා ඇති එකම වලංගු භාවිතය වනු ඇතැයි මම සිතමි.
GazB

නැතහොත් ඔබ XUL රාමුව භාවිතා කරමින් ක්‍රමලේඛනය කරන්නේ නම්, ඔබ css, xml සහ javascript භාවිතා කරමින් ගොඩනඟන මොසිල්ලාහි අතුරු මුහුණත් රාමුව.
ජෙරාඩ් ඔනිල්

1
AzGazB පවා එය භයානක අදහසකි! ඉතින් අද ඔබ දන්නවා ඔබේ සේවාදායකයින් මොසිල්ලා භාවිතා කරන බව. එවිට ඔවුන් වෙනත් දෙයක් භාවිතා කරන බව සඳහන් කරමින් නව සංදේශයක් එළියට එනවා. අපගේ ගෙවීම් පද්ධතිය උරා ගැනීමට හේතුව IE ... ඔබ IE8 භාවිතා කළ යුතු අතර කිසි විටෙකත් IE9 හෝ IE10 හෝ ෆයර්ෆොක්ස් හෝ ක්‍රෝම් භාවිතා කළ යුතු බැවින් එය ක්‍රියා
විරහිත වේ

25

ජාවාස්ක්‍රිප්ට් හි විෂය පථය පිළිබඳ අදහස මුලින් නිර්මාණය කළේ බ්‍රෙන්ඩන් අයිච් විසින් හයිපර්කාඩ් ස්ක්‍රිප්ටින් භාෂාව වන හයිපර්ටෝක් වෙතින් ය .

මෙම භාෂාවෙන්, දර්ශක කාඩ්පත් තොගයකට සමානය. පසුබිම ලෙස හැඳින්වෙන ප්‍රධාන කාඩ්පතක් තිබුණි. එය විනිවිද පෙනෙන අතර පහළ කාඩ්පත ලෙස දැකිය හැකිය. මෙම පාදක කාඩ්පතේ ඕනෑම අන්තර්ගතයක් එහි තබා ඇති කාඩ්පත් සමඟ බෙදා ගන්නා ලදි. ඉහළින් තබා ඇති සෑම කාඩ්පතකම තමන්ගේම අන්තර්ගතයක් ඇති අතර එය පෙර කාඩ්පතට වඩා ප්‍රමුඛස්ථානයක් ගත් නමුත් අවශ්‍ය නම් පෙර කාඩ්පත් වෙත ප්‍රවේශ විය.

ජාවාස්ක්‍රිප්ට් ස්කොපිං පද්ධතිය නිර්මාණය කර ඇත්තේ හරියටම මෙයයි. එයට වෙනස් නම් ඇත. ජාවාස්ක්‍රිප්ට් හි ඇති කාඩ්පත් ක්‍රියාත්මක කිරීමේ සන්දර්භය ECMA ලෙස හැඳින්වේ . මෙම සෑම සන්දර්භයකම ප්‍රධාන කොටස් තුනක් අඩංගු වේ. විචල්ය පරිසරයක්, ශබ්දකෝෂ පරිසරයක් සහ මෙම බන්ධනය. කාඩ්පත් යොමු කිරීම වෙත ආපසු යාම, ශබ්දකෝෂ පරිසරය තුළ පෙර කාඩ්පත්වල ඇති සියලුම අන්තර්ගතයන් තොගයේ පහළින් අඩංගු වේ. වත්මන් සන්දර්භය තොගයේ ඉහළින්ම ඇති අතර එහි ප්‍රකාශිත ඕනෑම අන්තර්ගතයක් විචල්‍ය පරිසරයේ ගබඩා වේ. ගැටුම් නම් කිරීමේදී විචල්‍ය පරිසරය ප්‍රමුඛස්ථානය ගනී.

මෙම බන්ධනය අඩංගු වස්තුව වෙත යොමු වේ. සමහර විට විෂය පථය වෙනස් කිරීමකින් තොරව විෂය පථයන් හෝ ක්‍රියාත්මක කිරීමේ සන්දර්භයන් වෙනස් වේ, එනම් ප්‍රකාශිත ශ්‍රිතයක අඩංගු වස්තුව විය හැකි windowහෝ ඉදිකිරීම් ශ්‍රිතයක් වැනි.

ඕනෑම වේලාවක පාලනය මාරු කළ විට මෙම ක්‍රියාත්මක කිරීමේ සන්දර්භයන් නිර්මාණය වේ. කේතය ක්‍රියාත්මක කිරීමට පටන් ගත් විට පාලනය මාරු වන අතර මෙය මූලික වශයෙන් සිදු කරනුයේ ශ්‍රිතය ක්‍රියාත්මක කිරීමෙනි.

එබැවින් තාක්ෂණික පැහැදිලි කිරීම එයයි. ප්රායෝගිකව, JavaScript හි එය මතක තබා ගැනීම වැදගත්ය

  • විෂය පථයන් තාක්‍ෂණිකව "ක්‍රියාත්මක කිරීමේ සන්දර්භය" වේ
  • සන්දර්භය විචල්යයන් ගබඩා කර ඇති පරිසරවල එකතුවක් සාදයි
  • තොගයේ මුදුන ප්‍රමුඛස්ථානය ගනී (පහළ කොටස ගෝලීය සන්දර්භයයි)
  • සෑම ශ්‍රිතයක්ම ක්‍රියාත්මක කිරීමේ සන්දර්භයක් නිර්මාණය කරයි (නමුත් සෑම විටම මෙම බන්ධනය අලුත් නොවේ)

මෙම පිටුවේ පෙර උදාහරණ වලින් එකකට (5. "වසා දැමීම") යෙදීමෙන්, ක්‍රියාත්මක කිරීමේ සන්දර්භයන් අනුගමනය කළ හැකිය. මෙම උදාහරණයේ දී තොගයේ සන්දර්භ තුනක් ඇත. ඒවා නිර්වචනය කරනු ලබන්නේ පිටත සන්දර්භය, var හය ලෙස හැඳින්වෙන ක්ෂණිකව ආයාචිත ශ්‍රිතයේ සන්දර්භය සහ var හය හි ක්ෂණිකව ආයාචිත ශ්‍රිතය තුළ ආපසු එන ශ්‍රිතයේ සන්දර්භය ය.

i ) බාහිර සන්දර්භය. එයට විචල්ය පරිසරයක් ඇත = 1
ii ) IIFE සන්දර්භය, එයට a = 1 හි ශබ්දකෝෂ පරිසරයක් ඇත, නමුත් a = 6 හි විචල්ය පරිසරය, එය තොගයේ ප්රමුඛතාවය ගනී
iii ) ආපසු ලබා දුන් ක්රියාකාරී සන්දර්භය, එයට ශබ්දකෝෂයක් ඇත පරිසරය a = 6 වන අතර එය ඇමතුමේදී ඇඟවීම්වල සඳහන් අගය වේ.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


17

1) ගෝලීය විෂය පථයක්, ක්‍රියාකාරී විෂය පථයක් සහ විත් ඇන්ඩ් ඇල්ලීමේ විෂය පථයන් ඇත. විචල්‍යයන් සඳහා පොදුවේ 'බ්ලොක්' මට්ටමේ විෂය පථයක් නොමැත - සමඟ සහ ඇල්ලීමේ ප්‍රකාශ ඔවුන්ගේ බ්ලොක් වලට නම් එකතු කරයි.

2) විෂය පථයන් ගෝලීය විෂය පථයට ගැලපෙන පරිදි කාර්යයන් මගින් කූඩු කර ඇත.

3) මූලාකෘති දාමය හරහා යාමෙන් ගුණාංග නිරාකරණය වේ. විත් බ්ලොක් මගින් අර්ථ දක්වා ඇති ශබ්දකෝෂ විෂය පථයට වස්තු දේපල නම් ගෙන එයි.

සංස්කරණය කරන්න: ECMAAScript 6 (සමගිය) ඉඩ දීම සඳහා සහය දැක්වීමට නියම කර ඇති අතර, ක්‍රෝම් විසින් 'සමගිය' ධජයකට ඉඩ දෙන බව මම දනිමි, එබැවින් සමහර විට එය එයට සහාය වනු ඇත ..

වාරණ මට්ටමේ විෂය පථය සඳහා ආධාරකයක් වනු ඇත, නමුත් එය සිදු කිරීම සඳහා ඔබ මූලික පදය භාවිතා කළ යුතුය.

සංස්කරණය කරන්න: බෙන්ජමින්ගේ අදහස් දැක්වීම් සමඟ කරුණු දැක්වීම සහ ප්‍රකාශයන් අල්ලා ගැනීම මත පදනම්ව, මම මෙම ලිපිය සංස්කරණය කර ඇති අතර තවත් බොහෝ දේ එකතු කර ඇත්තෙමි. සමග සහ උඩ ප්රකාශ දෙකම තම තමන්ගේ කුට්ටි බවට විචල්යයන් හදුන්වා, ඒ වන වාරණ විෂය පථය. මෙම විචල්‍යයන් ඒවාට ඇතුළු වන වස්තූන්ගේ ගුණාංග සමඟ අන්වර්ථ වේ.

 //chrome (v8)

 var a = { 'test1':'test1val' }
 test1   // error not defined
 with (a) { var test1 = 'replaced' }
 test1   // undefined
 a       // a.test1 = 'replaced'

සංස්කරණය කරන්න: පැහැදිලි කිරීමේ උදාහරණය:

test1 විෂ්කම්භය සහිත විෂය පථයට පරික්ෂා කර ඇත, නමුත් a.test1 වෙත අන්වර්ථ වේ. 'Var test1' නව විචල්‍ය test1 එකක් ඉහළ ශබ්දකෝෂ සන්දර්භය තුළ (ශ්‍රිතය හෝ ගෝලීය) නිර්මාණය කරයි, එය a හි දේපලක් නොවේ නම් - එය.

අහෝ! 'With' භාවිතා කිරීම ගැන සැලකිලිමත් වන්න - විචල්‍යය ශ්‍රිතය තුළ දැනටමත් අර්ථ දක්වා ඇත්නම් var යනු noop එකක් සේම, එය වස්තුවෙන් ආනයනය කරන ලද නම් සම්බන්ධයෙන් ද නොප් එකක් වේ! දැනටමත් නිර්වචනය කර ඇති නමට මඳක් ඉහළට යාම මෙය වඩාත් ආරක්ෂිත කරයි. මේ නිසා මම පෞද්ගලිකව කිසි විටෙකත් භාවිතා නොකරමි.


ඔබට මෙහි යම් යම් වැරදි තිබේ, මන්ද එක් ජාවාස්ක්‍රිප්ට් එකකට බ්ලොක් විෂය පථය ඇත.
බෙන්ජමින් ග ru න්බෝම්

මගේ කන් (ඇස්) විවෘතව ඇත, බෙන්ජමින් - ඉහත මගේ ප්‍රකාශයන් වන්නේ මම ජාවාස්ක්‍රිප්ට් විෂය පථයට ප්‍රතිකාර කළ ආකාරයයි, නමුත් ඒවා පිරිවිතර කියවීම මත පදනම් නොවේ. ඔබ ප්‍රකාශය සමඟ (එය වස්තු විෂය පථයක් වන) හෝ මොසිල්ලාගේ විශේෂ 'ඉඩ දෙන්න' වාක්‍ය ඛණ්ඩයට යොමු නොකරනු ඇතැයි මම බලාපොරොත්තු වෙමි.
ජෙරාඩ් ඔනිල්

හොඳයි, withප්රකාශයක් වේ වාරණ කරුණු නිශ්චය වශයෙන් යම් ආකාරයක නමුත් catchවගන්ති වඩාත් පොදු ආකෘති පත්රය (විනෝද ඇත්ත, V8 උපකරණ වේ catchසමඟ with) - එච්චරමයි JavaScript ම (දී, ශ්රිතයක් වේ ඒ වාරණ කරුණු නිශ්චය එකම ආකාරයේ, ගෝලීය, උත්සාහක / උඩ බව, , සමඟ සහ ඒවායේ ව්‍යුත්පන්නයන්), කෙසේ වෙතත් ධාරක පරිසරයන්ට විෂය පථය පිළිබඳ විවිධ අදහස් ඇත - නිදසුනක් ලෙස බ්‍රව්සරයේ පේළිගත සිදුවීම් සහ NodeJS හි vm මොඩියුලය.
බෙන්ජමින් ග ru න්බෝම්

බෙන්ජමින් - මට පෙනෙන දෙයින්, වස්තුව වර්තමාන විෂය පථයට (සහ ඒ අනුව ගුණාංග) පමණක් හඳුන්වා දෙයි, නමුත් අදාළ වාරණය අවසන් වූ පසු විචල්‍යයන් නැවත සකසනු ලැබේ. නමුත් නිදසුනක් ලෙස, අළුත් විචල්‍යයක් අල්ලා ගැනීමේදී හඳුන්වා දී ඇත්තේ ශ්‍රිතයේ / ක්‍රමයේ විෂය පථයයි.
ජෙරාඩ් ඔනිල්

2
බ්ලොක් විෂය පථය යනු හරියටම එයයි :)
බෙන්ජමින් ග ru න්බෝම්

9

ජාවාස්ක්‍රිප්ට් වෙත අළුත් බොහෝ දෙනෙකුට භාෂාවෙන් උරුමය පෙරනිමියෙන් ලබා ගත හැකි බව තේරුම් ගැනීමට අපහසු බවත්, ක්‍රියාකාරී විෂය පථය එකම විෂය පථය බවත් මම තේරුම් ගතිමි. මම පසුගිය වසර අවසානයේ JSPretty නමින් ලියූ රූපලාවණ්‍ය යන්ත්‍රයකට දිගුවක් ලබා දුන්නා. විශේෂාංග වර්ණ කේතයේ විෂය පථය ක්‍රියාත්මක වන අතර සෑම විටම එම විෂය පථයේ ප්‍රකාශිත සියලුම විචල්‍යයන්ට වර්ණයක් සම්බන්ධ කරයි. එක් විෂය පථයකින් වර්ණයක් සහිත විචල්‍යයක් වෙනත් විෂය පථයක භාවිතා කරන විට වසා දැමීම දෘශ්‍යමාන වේ.

මෙහි විශේෂාංගය උත්සාහ කරන්න:

මෙහි නිරූපණයක් බලන්න:

මෙහි කේතය බලන්න:

වර්තමානයේ මෙම විශේෂාංගය කැදැලි 16 ක ගැඹුරක් සඳහා සහය ලබා දෙයි, නමුත් දැනට ගෝලීය විචල්‍යයන් වර්ණවත් නොකරයි.


1
ෆයර්ෆොක්ස් 26 සමඟ මා වෙනුවෙන් ක්‍රියා නොකරයි. මම කේතය අලවන්න හෝ ගොනුවක් පටවන්න, ක්‍රියාත්මක කරන්න ක්ලික් කරන්න, කිසිවක් සිදු නොවේ.
mplwork

විෂය පථය සහ උරුමය යනු වෙනස් කරුණු දෙකකි.
බෙන් ඇස්ටන්

9

ජාවාස්ක්‍රිප්ට් සතුව ඇත්තේ විෂය පථ දෙකක් පමණි:

  1. ගෝලීය විෂය පථය : ගෝලීය යනු කවුළු මට්ටමේ විෂය පථයක් මිස අන් කිසිවක් නොවේ. මෙන්න, යෙදුම පුරා විචල්යය.
  2. ක්‍රියාකාරී විෂය පථය : යතුරුපදය සහිත ශ්‍රිතයක් තුළ ප්‍රකාශයට පත් කරන ලද varවිචල්‍යයට ක්‍රියාකාරී විෂය පථයක් ඇත.

ශ්‍රිතයක් හැඳින්වූ සෑම අවස්ථාවකම විචල්‍ය විෂය පථයක් නිර්මාණය වන අතර (විෂය පථ දාමයට ඇතුළත් වේ) එය ජාවාස්ක්‍රිප්ට් හි විචල්‍යයන් අනුගමනය කරයි.

        a = "global";
         function outer(){ 
              b = "local";
              console.log(a+b); //"globallocal"
         }
outer();

විෂය පථය ->

  1. කවුළු මට්ටම - aසහ outerක්‍රියාකාරිත්වය විෂය පථයේ ඉහළ මට්ටමේ පවතී.
  2. පිටත ශ්‍රිතය නව variable scope object(හා විෂය පථ දාමයට ඇතුළත් කර ඇති) ලෙස හඳුන්වන විට bඑය තුළ විචල්‍යය එකතු වේ .

දැන් විචල්‍යයක් aඅවශ්‍ය වූ විට එය පළමුව ළඟම විචල්‍ය විෂය පථය සොයන අතර විචල්‍යය නොමැති නම් එය විචල්‍ය විෂය පථයේ ඊළඟ වස්තුව වෙත ගමන් කරයි. මේ අවස්ථාවේ දී කවුළු මට්ටම වේ.


1
මෙය පිළිගත් පිළිතුර නොවන්නේ මන්දැයි විශ්වාස නැත. ඇත්ත වශයෙන්ම ක්‍රියාකාරී විෂය පථයක් ඇත (ECMA6 ට පෙර “දේශීය විෂය පථයක්” නොතිබුණි) සහ ගෝලීය බන්ධන
ටෙක්සාස්බ ru ස්

9

අනෙක් පිළිතුරු වලට එකතු කිරීම සඳහා, විෂය පථය යනු සියලු ප්‍රකාශිත හඳුනාගැනීම් (විචල්‍යයන්) පිළිබඳ සොයා බැලීමේ ලැයිස්තුවක් වන අතර, දැනට ක්‍රියාත්මක වන කේතයට මේවා ප්‍රවේශ විය හැකි ආකාරය පිළිබඳ දැඩි නීති මාලාවක් ක්‍රියාත්මක කරයි. මෙම විමසුම විචල්යයට පැවරීමේ අරමුණු සඳහා විය හැකිය, එය LHS (වම් පස) යොමුවකි, නැතහොත් එය RHS (දකුණු පස) යොමු කිරීමක් වන එහි අගය ලබා ගැනීමේ අරමුණු සඳහා විය හැකිය. මෙම සොයාගැනීම් යනු කේතය සම්පාදනය කර ක්‍රියාත්මක කිරීමේදී ජාවාස්ක්‍රිප්ට් එන්ජිම අභ්‍යන්තරව කරන්නේ කුමක්ද යන්නයි.

ඉතින් මෙම දෘෂ්ටිකෝණයෙන් බලන කල, කයිල් සිම්ප්සන් විසින් රචිත විෂය පථයන් සහ වසා දැමීම් පොතෙහි මා සොයාගත් පින්තූරයක් උපකාරී වනු ඇතැයි මම සිතමි.

රූප

ඔහුගේ විද්‍යුත් පොතෙන් උපුටා දැක්වීම:

ගොඩනැගිල්ල අපගේ වැඩසටහනේ කැදැලි විෂය පථය නියෝජනය කරයි. ගොඩනැගිල්ලේ පළමු මහල ඔබ කොතැනක සිටියත් දැනට ක්‍රියාත්මක වන විෂය පථය නියෝජනය කරයි. ගොඩනැගිල්ලේ ඉහළම මට්ටම ගෝලීය විෂය පථයයි. ඔබගේ වර්තමාන මහල දෙස බැලීමෙන් ඔබ LHS සහ RHS යොමු කිරීම් නිරාකරණය කරන අතර, ඔබට එය සොයාගත නොහැකි නම්, සෝපානය ඊළඟ මහලට ගෙන යාම, එහි බැලීම, ඊළඟට සහ යනාදිය. ඔබ ඉහළ තට්ටුවට ගිය පසු (ගෝලීය විෂය පථය), එක්කෝ ඔබ සොයන දේ ඔබ සොයා ගනී, නැතහොත් නැත. නමුත් ඔබ නොසලකා නතර කළ යුතුය.

සඳහන් කළ යුතු වටිනාම කරුණක් නම්, “පළමු තරගය සොයාගත් පසු විෂය පථය බැලීම නතර වේ”.

"විෂය පථ මට්ටම්" පිළිබඳ මෙම අදහස පැහැදිලි කරන්නේ කැදැලි ශ්‍රිතයක් දෙස බැලුවහොත් "මෙය" අලුතින් සාදන ලද විෂය පථයකින් වෙනස් කළ හැක්කේ මන්ද යන්නයි. මෙන්න මේ සියලු විස්තර වලට සම්බන්ධ වන සබැඳියක්, ඔබට ජාවාස්ක්‍රිප්ට් විෂය පථය ගැන දැන ගැනීමට අවශ්‍ය සියල්ල


8

කේතය ධාවනය කරන්න. මෙය විෂය පථය පිළිබඳ අදහසක් ලබා දෙනු ඇතැයි සිතමි

Name = 'global data';
document.Name = 'current document data';
(function(window,document){
var Name = 'local data';
var myObj = {
    Name: 'object data',
    f: function(){
        alert(this.Name);
    }
};

myObj.newFun = function(){
    alert(this.Name);
}

function testFun(){
    alert("Window Scope : " + window.Name + 
          "\nLocal Scope : " + Name + 
          "\nObject Scope : " + this.Name + 
          "\nCurrent document Scope : " + document.Name
         );
}


testFun.call(myObj);
})(window,document);

8

ගෝලීය විෂය පථය:

ගෝලීය විචල්‍යයන් හරියටම ගෝලීය තරු හා සමානයි (ජැකී චෑන්, නෙල්සන් මැන්ඩෙලා). ඔබගේ යෙදුමේ ඕනෑම කොටසකින් ඔබට ඒවාට ප්‍රවේශ විය හැකිය (අගය ලබා ගන්න හෝ සකසන්න). ගෝලීය කාර්යයන් ගෝලීය සිදුවීම් (අලුත් අවුරුදු, නත්තල්) වැනි ය. ඔබගේ යෙදුමේ ඕනෑම කොටසකින් ඔබට ඒවා ක්‍රියාත්මක කළ හැකිය (අමතන්න).

//global variable
var a = 2;

//global function
function b(){
   console.log(a);  //access global variable
}

දේශීය විෂය පථය:

ඔබ ඇමරිකා එක්සත් ජනපදයේ සිටී නම්, කුප්‍රකට කීර්තිමත් පුද්ගලයකු වන කිම් කාර්ඩාෂියන් ඔබ දන්නවා ඇති (ඇය කෙසේ හෝ ටැබ්ලොයිඩ් සෑදීමට කළමනාකරණය කරයි). නමුත් ඇමරිකාවෙන් පිටත පුද්ගලයින් ඇයව හඳුනා නොගනී. ඇය දේශීය තාරකාවකි.

දේශීය විචල්යයන් දේශීය තරු මෙන් ය. ඔබට ඒවාට ප්‍රවේශ විය හැක්කේ (අගය ලබා ගැනීම හෝ සැකසීම) විෂය පථය තුළ පමණි. දේශීය ශ්‍රිතයක් දේශීය සිදුවීම් හා සමානයි - ඔබට ක්‍රියාත්මක කළ හැක්කේ (සැමරීම) එම විෂය පථය තුළ පමණි. ඔබට විෂය පථයෙන් පිටත සිට ඒවාට ප්‍රවේශ වීමට අවශ්‍ය නම්, ඔබට යොමු දෝෂයක් ලැබෙනු ඇත

function b(){
   var d = 21; //local variable
   console.log(d);

   function dog(){  console.log(a); }
     dog(); //execute local function
}

 console.log(d); //ReferenceError: dddddd is not defined    

විෂය පථය පිළිබඳ ගැඹුරු අවබෝධයක් සඳහා මෙම ලිපිය පරීක්ෂා කරන්න


6

ජාවාස්ක්‍රිප්ට් විෂය පථයන් දෙකක් පමණක් තිබේ:

  • එක් එක් var ප්‍රකාශනයේ විෂය පථය ඉතා ඉක්මණින් සම්බන්ධ වන ශ්‍රිතය සමඟ සම්බන්ධ වේ
  • var ප්‍රකාශයක් සඳහා කොටු කිරීමේ කාර්යයක් නොමැති නම්, එය ගෝලීය විෂය පථය වේ

එබැවින්, කාර්යයන් හැර වෙනත් කිසිදු වාරණයක් නව විෂය පථයක් නිර්මාණය නොකරයි. For-loops පිටත විෂය පථ විචල්‍යයන් නැවත ලියන්නේ මන්දැයි එය පැහැදිලි කරයි:

var i = 10, v = 10;
for (var i = 0; i < 5; i++) { var v = 5; }
console.log(i, v);
// output 5 5

ඒ වෙනුවට කාර්යයන් භාවිතා කිරීම:

var i = 10, v = 10;
$.each([0, 1, 2, 3, 4], function(i) { var v = 5; });
console.log(i,v);
// output 10 10

පළමු උදාහරණයේ දී බ්ලොක් විෂය පථයක් නොතිබූ බැවින් මුලින් ප්‍රකාශයට පත් කළ විචල්‍යයන් නැවත ලියනු ලැබීය. දෙවන උදාහරණයේ දී, ශ්‍රිතය හේතුවෙන් නව විෂය පථයක් ඇති බැවින් මුලින් ප්‍රකාශයට පත් කරන ලද විචල්‍යයන් සෙවනැලි කරන ලද අතර නැවත ලියනු නොලැබේ.

ජාවාස්ක්‍රිප්ට් විෂය පථය අනුව ඔබ දැනගත යුතු සියල්ලම එයයි.

  • ව්‍යතිරේක විචල්‍යය සඳහා පමණක් නව විෂය පථයක් හඳුන්වා දීමට උත්සාහ කරන්න / අල්ලා ගන්න, අනෙක් විචල්‍යයන්ට නව විෂය පථයක් නොමැත
  • with-clause පෙනෙන පරිදි තවත් ව්‍යතිරේකයකි, නමුත් වගන්තිය සමඟ එය භාවිතා කිරීම අතිශයින් අධෛර්යමත් විය ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with )

එබැවින් ජාවාස්ක්‍රිප්ට් විෂය පථය සැබවින්ම අතිශය සරල බව ඔබට දැක ගත හැකිය. දැනුවත් විය යුතු කරුණු කිහිපයක්:

  • var ප්‍රකාශන විෂය පථයේ ඉහළට ඔසවා ඇත. මෙයින් අදහස් කරන්නේ var ප්‍රකාශය කොතැනක සිදු වුවද, සම්පාදකයාට එය var විසින්ම ඉහළින් සිදු වනවාක් මෙනි
  • එකම විෂය පථය තුළ බහු විචල්‍ය ප්‍රකාශයන් ඒකාබද්ධ වේ

එබැවින් මෙම කේතය:

var i = 1;
function abc() {
  i = 2;
  var i = 3;
}
console.log(i);     // outputs 1

සමාන වේ:

var i = 1;
function abc() {
  var i;     // var declaration moved to the top of the scope
  i = 2;
  i = 3;     // the assignment stays where it is
}
console.log(i);

මෙය ප්‍රතිභානීය බවක් පෙනෙන්නට තිබුණත්, එය අත්‍යවශ්‍ය භාෂා නිර්මාණකරුවෙකුගේ දෘෂ්ටිකෝණයෙන් අර්ථවත් කරයි.


5

නවීන Js, ES6 +, ' const' සහ ' let'

අනෙකුත් බොහෝ ප්‍රධාන භාෂාවන් මෙන් ඔබ නිර්මාණය කරන සෑම විචල්‍යයක් සඳහාම බ්ලොක් විෂය පථය භාවිතා කළ යුතුය. varවන යල් පැන ගිය . මෙය ඔබගේ කේතය ආරක්ෂිත සහ වඩා නඩත්තු කළ හැකිය.

const95% ක් සඳහා භාවිතා කළ යුතුය . එමඟින් එය විචල්‍ය යොමුව වෙනස් කළ නොහැක. අරාව, වස්තුව සහ DOM නෝඩ් ගුණාංග වෙනස් විය හැකි අතර එසේ විය යුතුය const.

letනැවත පැවරීමට අපේක්ෂා කරන ඕනෑම විචල්‍යයක් සඳහා භාවිතා කළ යුතුය. මෙය සඳහා ලූපයක් තුළ ඇතුළත් වේ. ආරම්භයෙන් ඔබ්බට ඔබ කවදා හෝ අගය වෙනස් කරන්නේ නම්, භාවිතා කරන්න let.

වාරණ විෂය පථය යනු විචල්‍යය ලබා ගත හැක්කේ එය ප්‍රකාශිත වරහන් තුළ පමණි. මෙය ඔබගේ විෂය පථය තුළ නිර්මාණය කරන ලද නිර්නාමික කාර්යයන් ඇතුළුව අභ්‍යන්තර විෂය පථයන් දක්වා විහිදේ.


3

මෙම කුතුහලය දනවන උදාහරණය උත්සාහ කරන්න. පහත උදාහරණයේ දී, 0 හි සංඛ්‍යාත්මකව ආරම්භ කර ඇත්නම්, ඔබට 0 සහ පසුව 1 පෙනෙනු ඇත. A වස්තුවක් සහ ජාවාස්ක්‍රිප්ට් හැර f1 එහි පිටපතකට වඩා f1 දර්ශකයක් පසු කරයි. ප්‍රති result ලය වන්නේ ඔබ දෙවරක් එකම අනතුරු ඇඟවීම ලබා ගැනීමයි.

var a = new Date();
function f1(b)
{
    b.setDate(b.getDate()+1);
    alert(b.getDate());
}
f1(a);
alert(a.getDate());

3

JS හි ඇත්තේ ශ්‍රිත විෂය පථයන් පමණි. විෂය පථ අවහිර නොකරයි! එසවීම යනු කුමක්දැයි ඔබට දැක ගත හැකිය.

var global_variable = "global_variable";
var hoisting_variable = "global_hoist";

// Global variables printed
console.log("global_scope: - global_variable: " + global_variable);
console.log("global_scope: - hoisting_variable: " + hoisting_variable);

if (true) {
    // The variable block will be global, on true condition.
    var block = "block";
}
console.log("global_scope: - block: " + block);

function local_function() {
    var local_variable = "local_variable";
    console.log("local_scope: - local_variable: " + local_variable);
    console.log("local_scope: - global_variable: " + global_variable);
    console.log("local_scope: - block: " + block);
    // The hoisting_variable is undefined at the moment.
    console.log("local_scope: - hoisting_variable: " + hoisting_variable);

    var hoisting_variable = "local_hoist";
    // The hoisting_variable is now set as a local one.
    console.log("local_scope: - hoisting_variable: " + hoisting_variable);
}

local_function();

// No variable in a separate function is visible into the global scope.
console.log("global_scope: - local_variable: " + local_variable);

(පිළිතුර පළ කිරීමෙන් දීර් time කාලයක්) අවහිරතා විෂය පථය; developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
බොබ්

2

විෂය පථ 3 ක් ඇති බව මගේ අවබෝධයයි: ගෝලීය විෂය පථය, ගෝලීය වශයෙන් ලබා ගත හැකිය; දේශීය විෂය පථය, කුට්ටි නොසලකා සම්පූර්ණ කාර්යයක් සඳහා ලබා ගත හැකිය; සහ අවහිර කිරීමේ විෂය පථය, එය භාවිතා කළ වාරණය, ප්‍රකාශය හෝ ප්‍රකාශනය සඳහා පමණි. ගෝලීය සහ දේශීය විෂය පථය 'var' යන පදය සමඟ, ශ්‍රිතයක් තුළ හෝ ඉන් පිටත දක්වා ඇති අතර, බ්ලොක් විෂය පථය 'ඉඩ දෙන්න' යන මූල පදය සමඟ දක්වනු ලැබේ.

ගෝලීය සහ දේශීය විෂය පථයක් පමණක් ඇතැයි විශ්වාස කරන අයට, කරුණාකර මොසිල්ලාට ජේඑස් හි බ්ලොක් විෂය පථයේ සූක්ෂ්මතාවයන් විස්තර කරන සම්පූර්ණ පිටුවක් ඇත්තේ මන්දැයි පැහැදිලි කරන්න.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let


2

ඉදිරිපස කේත රචකයන් බොහෝ විට ක්‍රියාත්මක වන බව තවමත් විස්තර කර නොමැති ඉතා පොදු ගැටළුවක් වන්නේ HTML හි පේළිගත සිදුවීම් හසුරුවන්නෙකුට පෙනෙන විෂය පථයයි - නිදසුනක් ලෙස

<button onclick="foo()"></button>

on*ගුණාංගයකට යොමු කළ හැකි විචල්‍යයන්ගේ විෂය පථය විය යුත්තේ:

  • ගෝලීය (වැඩ කරන පේළි හසුරුවන්නන් සෑම විටම පාහේ ගෝලීය විචල්‍යයන් ගැන සඳහන් කරයි)
  • ලේඛනයේ දේපලක් (උදා: querySelectorස්වාධීන විචල්‍යයක් ලෙස දක්වනු ඇත document.querySelector; දුර්ලභ)
  • හසුරුවන්නා අමුණා ඇති මූලද්‍රව්‍යයේ දේපලක් (ඉහත පරිදි; දුර්ලභ)

එසේ නොමැතිනම්, හසුරුවන්නාට ආයාචනා කළ විට ඔබට විමර්ශන දෝෂයක් ලැබෙනු ඇත. උදාහරණයක් ලෙස, පේළිගත කිරීමේ හසුරුවන්නා විසින් ඇතුළත අර්ථ දක්වා ඇති ශ්‍රිතයක් ගැන සඳහන් කරන්නේ නම් window.onloadහෝ $(function() {යොමු කිරීම අසාර්ථක වනු ඇත, මන්ද පේළිගත හසුරුවන්නාට ගෝලීය විෂය පථයේ විචල්‍යයන් පමණක් සඳහන් කළ හැකි අතර ශ්‍රිතය ගෝලීය නොවේ:

පිළිබඳ ගුණ documentසහ මූලද්රව්යයක ගුණ හසුරුවන්නා පේළිගත පේනු පළ කළහ නිසා පේළිගත පේනු තුල නවීන විචල්ය ලෙස ද පරිශිලකයන්ට ඉඩ අනුයුක්තව සේවය කරන තුල දෙකක withකොටස් , සඳහා එක් documentවූ අංගයක් ලෙස, එක්. මෙම හසුරුවන්නන් තුළ ඇති විචල්‍යයන්ගේ විෂය පථය අතිශයින්ම නොදැනුවත්වම ක්‍රියාත්මක වන අතර, වැඩ කරන සිදුවීම් හසුරුවන්නෙකුට බොහෝ විට ශ්‍රිතයක් ගෝලීය වීමට අවශ්‍ය වනු ඇත (අනවශ්‍ය ගෝලීය දූෂණය වළක්වා ගත යුතුය ).

පේළිගත හසුරුවන්නන් තුළ ඇති විෂය පථය ඉතා අමුතු නිසාත්, පේළිගත හසුරුවන්නන්ට ගෝලීය දූෂණය වැඩ කිරීමට අවශ්‍ය නිසාත්, පේළි හසුරුවන්නන් සමහර විට තර්ක ඉදිරිපත් කිරීමේදී කැත නූල් ගැලවී යා යුතු නිසාත්, ඒවා වළක්වා ගැනීම පහසුය. ඒ වෙනුවට, addEventListenerHTML සලකුණු සමඟ නොව ජාවාස්ක්‍රිප්ට් භාවිතයෙන් සිදුවීම් හසුරුවන්නන් අමුණන්න .


වෙනත් සටහනක, <script>ඉහළ මට්ටමේ ධාවනය වන සාමාන්‍ය ටැග් මෙන් නොව , ES6 මොඩියුල තුළ ඇති කේතය එහි පුද්ගලික විෂය පථය තුළ ක්‍රියාත්මක වේ. සාමාන්‍ය <script>ටැගයක ඉහළින් අර්ථ දක්වා ඇති විචල්‍යයක් ගෝලීය බැවින් ඔබට එය වෙනත් <script>ටැග් වල සඳහන් කළ හැකිය :

නමුත් ES6 මොඩියුලයක ඉහළ මට්ටම ගෝලීය නොවේ . ES6 මොඩියුලයක ඉහළින් ප්‍රකාශිත විචල්‍යයක් දෘශ්‍ය වන්නේ එම මොඩියුලය තුළ පමණි, විචල්‍යය පැහැදිලිව exportසංස්කරණය නොකළහොත් හෝ එය ගෝලීය වස්තුවක දේපලකට පවරා නොමැති නම් පමණි.

ES6 මොඩියුලයක ඉහළ මට්ටම සාමාන්‍යයෙන් ඉහළ මට්ටමේ IIFE හි අභ්‍යන්තරයට සමාන වේ <script>. මොඩියුලයට ගෝලීය වන ඕනෑම විචල්‍යයන් යොමු කළ හැකි අතර මොඩියුලය ඒ සඳහා පැහැදිලිව නිර්මාණය කර ඇත්නම් මිස මොඩියුලය තුළ කිසිවක් සඳහන් කළ නොහැක.


1

ජාවාස්ක්‍රිප්ට් හි විෂය පථ දෙකක් තිබේ:

  • දේශීය විෂය පථය
  • ගෝලීය විෂය පථය

පහත ශ්‍රිතයට දේශීය විෂය පථ විචල්‍යයක් carNameඇත. තවද මෙම විචල්‍යය ශ්‍රිතයට පිටතින් ප්‍රවේශ විය නොහැක.

function myFunction() {
    var carName = "Volvo";
    alert(carName);
    // code here can use carName
}

පහළ පන්තියට ගෝලීය විෂය පථ විචල්‍යයක් carNameඇත. මෙම විචල්‍යය පන්තියේ සෑම තැනකින්ම ප්‍රවේශ විය හැකිය.

class {

    var carName = " Volvo";

    // code here can use carName

    function myFunction() {
        alert(carName);
        // code here can use carName 
    }
}

1

ES5 හා ඉන් පෙර:

ජාවාස්ක්‍රිප්ට් හි විචල්‍යයන් මුලදී (පෙර ES6) ශබ්දකෝෂයෙන් ක්‍රියා කරන ලදි. ශබ්දකෝෂයෙන් විෂය පථය යන්නෙන් අදහස් කරන්නේ ඔබට කේතය දෙස බැලීමෙන් විචල්‍යයන්ගේ විෂය පථය දැකිය හැකි බවයි.

varමූල පදය සමඟ ප්‍රකාශිත සෑම විචල්‍යයක්ම ශ්‍රිතයට පරික්ෂා කෙරේ. කෙසේ වෙතත්, එම ශ්‍රිතය තුළ වෙනත් ශ්‍රිතයක් ප්‍රකාශයට පත් කළ හොත් එම ශ්‍රිතයන්ට බාහිර ශ්‍රිතයන්ගේ විචල්‍යයන්ට ප්‍රවේශය ලැබේ. මෙය විෂය පථ දාමයක් ලෙස හැඳින්වේ . එය පහත පරිදි ක්රියා කරයි:

  1. ශ්‍රිතයක් විචල්‍ය අගයක් නිරාකරණය කිරීමට බැලූ විට එය මුලින්ම එහි විෂය පථය දෙස බලයි. මෙය ක්‍රියාකාරී ශරීරයයි, එනම් වක්‍ර වරහන් අතර ඇති සියල්ල}} ( මෙම විෂය පථයේ ඇති වෙනත් ශ්‍රිතවල විචල්‍යයන් හැර ).
  2. ශ්‍රිත ශරීරය තුළ එයට විචල්‍යය සොයාගත නොහැකි නම්, එය දාමය දක්වා නැඟී ශ්‍රිතය අර්ථ දක්වා ඇති ශ්‍රිතයේ විචල්‍ය විෂය පථය දෙස බලයි . ශබ්දකෝෂ විෂය පථයෙන් අදහස් කරන්නේ මෙයයි, මෙම ශ්‍රිතය අර්ථ දක්වා ඇති කේතයෙන් අපට දැකිය හැකි අතර එමඟින් කේතය දෙස බැලීමෙන් විෂය පථය තීරණය කළ හැකිය.

උදාහරණයක්:

// global scope
var foo = 'global';
var bar = 'global';
var foobar = 'global';

function outerFunc () {
 // outerFunc scope
 var foo = 'outerFunc';
 var foobar = 'outerFunc';
 innerFunc();
 
 function innerFunc(){
 // innerFunc scope
  var foo = 'innerFunc';
  console.log(foo);
  console.log(bar);
  console.log(foobar);
  }
}

outerFunc();

අප විචල්යයන් ප්රවිෂ්ට කර ගැනීම සඳහා, උත්සාහ වන විට සිදු වන foo, barහා foobarකොන්සෝලය වෙත පහත සඳහන් වේ:

  1. අපි foo කොන්සෝලය වෙත ලොග් කිරීමට උත්සාහ කරමු, foo ශ්‍රිතය innerFuncතුළම සොයාගත හැකිය. එමනිසා, foo හි අගය නූලට නිරාකරණය වේ innerFunc.
  2. අපි කොන්සෝලය වෙත තීරුව ලොග් කිරීමට උත්සාහ කරමු, ශ්‍රිතය innerFuncතුළම තීරුව සොයාගත නොහැක . එබැවින්, අපි විෂය පථය තරණය කළ යුතුය. අපි පළමුව බලන්නේ ශ්‍රිතය innerFuncඅර්ථ දක්වා ඇති බාහිර ශ්‍රිතයෙනි. මෙය ශ්‍රිතයයි outerFunc. විෂය පථය තුළ outerFuncඅපට 'පිටත ෆන්ක්' නූල රඳවා ඇති විචල්ය තීරුව සොයාගත හැකිය.
  3. අභ්‍යන්තර ෆන්ක් හි foobar සොයාගත නොහැක. . එමනිසා, අප විසින් විෂය පථය අභ්‍යන්තර ෆන්ක් විෂය පථයට නැගිය යුතුය. එය ද මෙහි සොයාගත නොහැක, අපි ගෝලීය විෂය පථයට තවත් මට්ටමකට නැඟෙමු (එනම් පිටත විෂය පථය). 'ගෝලීය' නූල දරණ විචල්ය ෆූබාර් මෙහි අපට හමු වේ. විෂය පථයේ දාමයට නැගීමෙන් පසු එය විචල්‍යය සොයා නොගත්තේ නම්, ජේඑස් එන්ජිම යොමු දෝෂයක් විසි කරයි .

ES6 (ES 2015) සහ ඊට වැඩි:

ශබ්දකෝෂ විෂය පථය සහ විෂය පථය යන සංකල්ප තවමත් අදාළ වේ ES6. කෙසේ වෙතත් විචල්යයන් ප්රකාශ කිරීමට නව ක්රම හඳුන්වා දෙන ලදී. පහත සඳහන් දෑ ඇත:

  • let: බ්ලොක් ස්කොප් විචල්‍යයක් නිර්මාණය කරයි
  • const: බ්ලොක් ස්කොප් විචල්‍යයක් නිර්මාණය කරයි, එය ආරම්භ කළ යුතු අතර නැවත පැවරිය නොහැක

අතර විශාලතම වෙනස varසහ let/ constබවයි varබැවින්ද කාර්යය scoped වේ let/ constවාරණ scoped ඇත. මෙය නිදර්ශනය කිරීමට උදාහරණයක් මෙන්න:

let letVar = 'global';
var varVar = 'global';

function foo () {
  
  if (true) {
    // this variable declared with let is scoped to the if block, block scoped
    let letVar = 5;
    // this variable declared with let is scoped to the function block, function scoped
    var varVar = 10;
  }
  
  console.log(letVar);
  console.log(varVar);
}


foo();

ඉහත උදාහරණයේ දී letVar ගෝලීය අගය ලොග් කරයි, මන්ද ප්‍රකාශිත විචල්‍යයන් letඅවහිර කර ඇත. ඒවා අදාළ බ්ලොක් එකෙන් පිටත නොපවතින බැවින් විචල්‍යය if block එකෙන් පිටත ප්‍රවේශ විය නොහැක.


0

EcmaScript5 හි ප්‍රධාන වශයෙන් විෂය පථ දෙකක් ඇත, දේශීය විෂය පථය සහ ගෝලීය විෂය පථය, නමුත් EcmaScript6 හි අපට ප්‍රධාන වශයෙන් විෂය පථ තුනක් ඇත, දේශීය විෂය පථය, ගෝලීය විෂය පථය සහ බ්ලොක් විෂය පථය නමින් නව විෂය පථයක් .

වාරණ විෂය පථයට උදාහරණය: -

for ( let i = 0; i < 10; i++)
{
 statement1...
statement2...// inside this scope we can access the value of i, if we want to access the value of i outside for loop it will give undefined.
}

0

ECMAScript 6 මඟින් ඉඩ සහ සංයුක්ත වචන හඳුන්වා දෙන ලදි. මෙම මූල පද var යතුරු පදය වෙනුවට භාවිතා කළ හැකිය. Var keyword ට පටහැනිව, බ්ලොක් ප්‍රකාශ තුළ දේශීය විෂය පථය ප්‍රකාශ කිරීමට ඉඩ දෙන්න.

var x = 10
let y = 10
const z = 10
{
  x = 20
  let y = 20
  const z = 20
  {
    x = 30
    // x is in the global scope because of the 'var' keyword
    let y = 30
    // y is in the local scope because of the 'let' keyword
    const z = 30
    // z is in the local scope because of the 'const' keyword
    console.log(x) // 30
    console.log(y) // 30
    console.log(z) // 30
  }
  console.log(x) // 30
  console.log(y) // 20
  console.log(z) // 20
}

console.log(x) // 30
console.log(y) // 10
console.log(z) // 10

0

පිළිගත් පිළිතුරට මම ඇත්තෙන්ම කැමතියි නමුත් මට මෙය එකතු කිරීමට අවශ්‍යයි:

විෂය පථය විසින් ප්‍රකාශිත සියලුම හඳුනාගැනීම් (විචල්‍යයන්) පිළිබඳ ලැයිස්තුවක් එකතු කර පවත්වාගෙන යන අතර දැනට ක්‍රියාත්මක වන කේතයට මේවා ප්‍රවේශ විය හැකි ආකාරය පිළිබඳ දැඩි නීති මාලාවක් ක්‍රියාත්මක කරයි.

විෂය පථය යනු ඒවායේ හඳුනාගැනීමේ නාමයෙන් විචල්‍යයන් සොයා බැලීමේ නීති මාලාවකි.

  • ක්ෂණික විෂය පථය තුළ විචල්‍යයක් සොයාගත නොහැකි නම්, එන්ජිම ඊළඟ පිටත අඩංගු විෂය පථය විමසයි, සොයා ගන්නා තෙක් හෝ පිටත (අකා, ගෝලීය) විෂය පථය ළඟා වන තෙක් දිගටම කරගෙන යයි.
  • යනු විචල්‍යයක් (හඳුනාගැනීමක්) සොයාගත හැක්කේ කොතැනද සහ කෙසේද යන්න තීරණය කරන නීති සමූහයකි. මෙම බැල්ම විචල්යයට පැවරීමේ අරමුණු සඳහා විය හැකිය, එය එල්එච්එස් (වම් පස) යොමුවකි, නැතහොත් එය ආර්එච්එස් (දකුණු පස) යොමු කිරීමක් වන එහි අගය ලබා ගැනීමේ අරමුණු සඳහා විය හැකිය. .
  • LHS යොමු කිරීම් පැවරුම් මෙහෙයුම් වල ප්‍රති result ලයකි. විෂය පථයට සම්බන්ධ පැවරුම් = ක්‍රියාකරු සමඟ හෝ ශ්‍රිත පරාමිතීන් වෙත (පැවරීම) තර්ක ඉදිරිපත් කිරීමෙන් සිදුවිය හැකිය.
  • ජාවාස්ක්‍රිප්ට් එන්ජිම ක්‍රියාත්මක කිරීමට පෙර කේතය සම්පාදනය කරන අතර එසේ කිරීමෙන් එය var a = 2 වැනි ප්‍රකාශ බෙදී යයි; පියවර දෙකකට: 1 වන. පළමුව, එම විෂය පථය තුළ එය ප්‍රකාශ කිරීමට var a. කේත ක්‍රියාත්මක කිරීමට පෙර මෙය ආරම්භයේදීම සිදු කෙරේ. 2 වන. පසුව, විචල්‍යය (LHS යොමුව) බැලීමට a = 2 සහ සොයාගත හොත් එයට අනුයුක්ත කරන්න.
  • එල්එච්එස් සහ ආර්එච්එස් යොමු විමසීම් දෙකම දැනට ක්‍රියාත්මක වන විෂය පථයෙන් ආරම්භ වන අතර, අවශ්‍ය නම් (එනම්, ඔවුන් එහි සොයන දේ සොයා නොගනී), ඔවුන් කැදැලි විෂය පථය, එක් විෂය පථයක් (මහල ) වරකට, ඔවුන් ගෝලීය (ඉහළ මහල) වෙත ගොස් නතර වන තුරු, හඳුනාගැනුම සොයමින්, එය සොයා ගන්න, නැතහොත් නොකරන්න. සපුරා නොමැති RHS යොමු කිරීම් හේතුවෙන් ReferenceError විසි කරනු ලැබේ. සපුරා නොමැති LHS යොමු කිරීම්වල ප්‍රති result ලය වන්නේ එම නාමයේ ස්වයංක්‍රීයව, ව්‍යංගයෙන් නිර්මාණය කරන ලද ගෝලීය (දැඩි ප්‍රකාරයේදී නොවේ නම්), හෝ යොමු දෝෂයක් (දැඩි ප්‍රකාරයේදී නම්) ය.
  • විෂය පථය සමන්විත වන්නේ “බුබුලු” මාලාවකින් වන අතර ඒවා එක් එක් බහාලුමක් හෝ බාල්දියක් ලෙස ක්‍රියා කරයි, එහිදී හඳුනාගැනීම් (විචල්‍යයන්, ශ්‍රිත) ප්‍රකාශයට පත් කෙරේ. මෙම බුබුලු එකිනෙකා තුළ පිළිවෙලට කූඩු කර ඇති අතර මෙම කැදැල්ල කර්තෘ වේලාවේදී අර්ථ දක්වා ඇත.

-3

ජාවාස්ක්‍රිප්ට් හි විෂය පථයන් දෙකක් තිබේ.

  1. ගෝලීය විෂය පථය : ගෝලීය විෂය පථයෙන් ප්‍රකාශයට පත් කරන ලද විචල්‍යය වැඩසටහනේ ඕනෑම තැනක ඉතා පහසුවෙන් භාවිතා කළ හැකිය. උදාහරණයක් වශයෙන්:

    var carName = " BMW";
    
    // code here can use carName
    
    function myFunction() {
         // code here can use carName 
    }
  2. ක්‍රියාකාරී විෂය පථය හෝ දේශීය විෂය පථය : මෙම විෂය පථයේ ප්‍රකාශිත විචල්‍යය භාවිතා කළ හැක්කේ එහි ශ්‍රිතයට පමණි. උදාහරණයක් වශයෙන්:

    // code here can not use carName
    function myFunction() {
       var carName = "BMW";
       // code here can use carName
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.