ජාවාස්ක්රිප්ට් හි විචල්යයන්ගේ විෂය පථය කුමක්ද? ශ්රිතයකට පරිබාහිරව ඔවුන් තුළ එකම විෂය පථයක් තිබේද? නැත්නම් එය පවා වැදගත්ද? එසේම, විචල්යයන් ගෝලීයව නිර්වචනය කර ඇත්නම් ඒවා ගබඩා කරන්නේ කොහේද?
ජාවාස්ක්රිප්ට් හි විචල්යයන්ගේ විෂය පථය කුමක්ද? ශ්රිතයකට පරිබාහිරව ඔවුන් තුළ එකම විෂය පථයක් තිබේද? නැත්නම් එය පවා වැදගත්ද? එසේම, විචල්යයන් ගෝලීයව නිර්වචනය කර ඇත්නම් ඒවා ගබඩා කරන්නේ කොහේද?
Answers:
ජාවාස්ක්රිප්ට් සතුව ශබ්දකෝෂ (ස්ථිතික ලෙසද හැඳින්වේ) විෂය පථය සහ වසා දැමීම් ඇත. මෙයින් අදහස් කරන්නේ ප්රභව කේතය බැලීමෙන් ඔබට හඳුනාගැනීමේ විෂය පථය පැවසිය හැකි බවයි.
විෂය පථ හතර නම්:
ගෝලීය සහ මොඩියුලයේ විෂය පථයට පිටතින්, විචල්යයන් ප්රකාශයට පත් කරනුයේ var
(ශ්රිත විෂය පථය), let
(වාරණ විෂය පථය) සහ const
(වාරණ විෂය පථය) භාවිතා කරමිනි . අනන්යතා ප්රකාශනයේ වෙනත් බොහෝ ආකාරවල දැඩි මාදිලියේ වාරණ විෂය පථයක් ඇත.
විෂය පථය යනු හඳුනාගැනීමේ යන්ත්රයක් වලංගු වන කේත පදනමේ කලාපයයි.
ශබ්දකෝෂ පරිසරයක් යනු හඳුනාගැනීමේ නම් සහ ඒවා හා සම්බන්ධ අගයන් අතර සිතියම්ගත කිරීමකි.
විෂය පථය සෑදී ඇත්තේ ශබ්දකෝෂ පරිසරවල සම්බන්ධිත කැදැල්ලකිනි, කැදැල්ලේ සෑම මට්ටමක්ම මුතුන් මිත්තන්ගේ ution ාතන සන්දර්භයක ශබ්දකෝෂ පරිසරයකට අනුරූප වේ.
මෙම සම්බන්ධිත ශබ්දකෝෂ පරිසරයන් විෂය පථයක් “දාමයක්” සාදයි. හැඳුනුම් විභේදනය යනු ගැලපෙන හඳුනාගැනීමක් සඳහා මෙම දාමය ඔස්සේ සෙවීමේ ක්රියාවලියයි.
හඳුනාගැනීමේ විභේදනය සිදුවන්නේ එක් දිශාවකට පමණි: පිටතට. මේ ආකාරයට පිටත ශබ්දකෝෂ පරිසරයන්ට අභ්යන්තර ශබ්දකෝෂ පරිසරයන්ට “නොපෙනේ”.
ජාවාස්ක්රිප්ට් හි හඳුනාගැනීමේ විෂය පථය තීරණය කිරීමේදී අදාළ සාධක තුනක් තිබේ :
හඳුනාගැනීම් ප්රකාශ කළ හැකි ක්රම කිහිපයක්:
var
, let
සහconst
var
දැඩි නොවන ආකාරයෙන් මඟ හැරීම )import
ප්රකාශeval
සමහර ස්ථාන හඳුනාගැනීම් ප්රකාශ කළ හැකිය:
ගෝලීය සන්දර්භය තුළ කෙලින්ම ප්රකාශයට පත් කරන ලද ඒවා හැරුණු විට ඒවා භාවිතා කරන 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
නූල්, විචල්ය භාවිතා ප්රකාශ 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]]
ශ්රිත-වස්තුවෙහි අගය නව ක්රියාත්මක කිරීමේ සන්දර්භයේ ශබ්දකෝෂ පරිසරය පිළිබඳ බාහිර යොමු ක්ෂේත්රයකට පිටපත් කිරීමෙනි .
නව ක්රියාත්මක කිරීමේ සන්දර්භය සහ ශ්රිත වස්තුවේ ශබ්දකෝෂ පරිසරය අතර මෙම සම්බන්ධතාවය වසා දැමීමක් ලෙස හැඳින්වෙන බව සලකන්න .
මේ අනුව, ජාවාස්ක්රිප්ට් හි විෂය පථය ක්රියාත්මක වන්නේ බාහිර යොමු කිරීම් මගින් “දාමයක” එකට බැඳී ඇති ශබ්දකෝෂ පරිසරයන් හරහා ය. මෙම ශබ්දකෝෂ පරිසරය විෂය පථය ලෙස හැඳින්වෙන අතර, හඳුනාගැනීමේ විභේදනය සිදුවන්නේ ගැලපෙන හඳුනාගැනීමක් සඳහා දාමය සෙවීමෙනි.
වැඩි විස්තර සොයන්න .
දී ඇති ශ්රිතයක් සඳහා විෂය පථය ස්ථාපිත කිරීම සඳහා ජාවාස්ක්රිප්ට් විෂය පථ දාම භාවිතා කරයි. සාමාන්යයෙන් එක් ගෝලීය විෂය පථයක් ඇති අතර, අර්ථ දක්වා ඇති සෑම ශ්රිතයකටම එයටම ආවේණික වූ විෂය පථයක් ඇත. වෙනත් ශ්රිතයක් තුළ අර්ථ දක්වා ඇති ඕනෑම ශ්රිතයකට දේශීය ශ්රිතයක් ඇති අතර එය බාහිර ශ්රිතයට සම්බන්ධ වේ. එය සෑම විටම විෂය පථය නිර්වචනය කරන ප්රභවයේ පිහිටීමයි.
විෂය පථයේ දාමයක් මූලික වශයෙන් එහි මව් විෂය පථයට දර්ශකයක් සහිත සිතියමකි.
විචල්යයක් නිරාකරණය කිරීමේදී, ජාවාස්ක්රිප්ට් අභ්යන්තරයේ විෂය පථයෙන් ආරම්භ වී පිටතට සොයයි.
ගෝලීය වශයෙන් ප්රකාශයට පත් කරන ලද විචල්යයන්ට ගෝලීය විෂය පථයක් ඇත. ශ්රිතයක් තුළ ප්රකාශයට පත් කරන ලද විචල්යයන් එම ශ්රිතයට අනුරූප වන අතර එකම නමින් ගෝලීය විචල්යයන් සෙවනැල්ල කරයි.
(සැබෑ ජාවාස්ක්රිප්ට් ක්රමලේඛකයින්ට වෙනත් පිළිතුරු වලින් පෙන්වා දීමට හැකි වනු ඇති බව මට විශ්වාසයි. විශේෂයෙන් ඕනෑම වේලාවක හරියටම අදහස් කරන්නේ කුමක්ද යන්න පිළිබඳව මම මෙම පිටුව හරහා පැමිණියෙමි this
. ඔබ ආරම්භ කිරීමට මෙම හඳුන්වාදීමේ සබැඳිය ප්රමාණවත් යැයි සිතමි .)
සාම්ප්රදායිකව, ජාවාස්ක්රිප්ට් සතුව ඇත්තේ විෂය පථ දෙකක් පමණි:
වෙනස පැහැදිලි කරන තවත් බොහෝ පිළිතුරු දැනටමත් ඇති බැවින් මම මේ ගැන විස්තර නොකරමි.
මෙම වඩාත් ම මෑත JavaScript උපැස් දැන් ද තුන්වන විෂය පථය ඉඩ:
සාම්ප්රදායිකව, ඔබ ඔබේ විචල්යයන් මේ ආකාරයෙන් නිර්මාණය කරයි:
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
:
ඔබ let
මෙම පිළිතුර කියවන අවස්ථාවේදී ප්රකාශයට සහාය දක්වන බ්රව්සර් පිළිබඳ යාවත්කාලීන දළ විශ්ලේෂණයක් සඳහා , මෙම Can I Use
පිටුව බලන්න .
(*) ජාවාස්ක්රිප්ට් විචල්යයන් එසවීම නිසා ඒවා ප්රකාශයට පත් කිරීමට පෙර ගෝලීයව හා ක්රියාකාරීව විෂය පථයන් ආරම්භ කර භාවිතා කළ හැකිය . මෙයින් අදහස් කරන්නේ ප්රකාශන සෑම විටම විෂය පථයට ඉහළින් ඇති බවයි.
මෙන්න උදාහරණයක්:
<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>
වසා දැමීම් සහ පුද්ගලික සාමාජිකයන් සෑදීමට ඒවා භාවිතා කරන්නේ කෙසේද යන්න විමර්ශනය කිරීමට ඔබට අවශ්ය වනු ඇත .
යතුර, මා තේරුම් ගත් පරිදි, ජාවාස්ක්රිප්ට්හි වඩාත් පොදු සී බ්ලොක් විෂය පථයට එදිරිව ක්රියාකාරී මට්ටමේ විෂය පථයක් ඇත.
"ජාවාස්ක්රිප්ට් 1.7" (මොසිල්ලා ජාවාස්ක්රිප්ට් වෙත දිගුව) තුළ කෙනෙකුට let
ප්රකාශය සමඟ බ්ලොක්-ස්කොප් විචල්යයන් ප්රකාශ කළ හැකිය :
var a = 4;
let (a = 3) {
alert(a); // 3
}
alert(a); // 4
let
.
ජාවාස්ක්රිප්ට් හි විෂය පථය පිළිබඳ අදහස මුලින් නිර්මාණය කළේ බ්රෙන්ඩන් අයිච් විසින් හයිපර්කාඩ් ස්ක්රිප්ටින් භාෂාව වන හයිපර්ටෝක් වෙතින් ය .
මෙම භාෂාවෙන්, දර්ශක කාඩ්පත් තොගයකට සමානය. පසුබිම ලෙස හැඳින්වෙන ප්රධාන කාඩ්පතක් තිබුණි. එය විනිවිද පෙනෙන අතර පහළ කාඩ්පත ලෙස දැකිය හැකිය. මෙම පාදක කාඩ්පතේ ඕනෑම අන්තර්ගතයක් එහි තබා ඇති කාඩ්පත් සමඟ බෙදා ගන්නා ලදි. ඉහළින් තබා ඇති සෑම කාඩ්පතකම තමන්ගේම අන්තර්ගතයක් ඇති අතර එය පෙර කාඩ්පතට වඩා ප්රමුඛස්ථානයක් ගත් නමුත් අවශ්ය නම් පෙර කාඩ්පත් වෙත ප්රවේශ විය.
ජාවාස්ක්රිප්ට් ස්කොපිං පද්ධතිය නිර්මාණය කර ඇත්තේ හරියටම මෙයයි. එයට වෙනස් නම් ඇත. ජාවාස්ක්රිප්ට් හි ඇති කාඩ්පත් ක්රියාත්මක කිරීමේ සන්දර්භය ECMA ලෙස හැඳින්වේ . මෙම සෑම සන්දර්භයකම ප්රධාන කොටස් තුනක් අඩංගු වේ. විචල්ය පරිසරයක්, ශබ්දකෝෂ පරිසරයක් සහ මෙම බන්ධනය. කාඩ්පත් යොමු කිරීම වෙත ආපසු යාම, ශබ්දකෝෂ පරිසරය තුළ පෙර කාඩ්පත්වල ඇති සියලුම අන්තර්ගතයන් තොගයේ පහළින් අඩංගු වේ. වත්මන් සන්දර්භය තොගයේ ඉහළින්ම ඇති අතර එහි ප්රකාශිත ඕනෑම අන්තර්ගතයක් විචල්ය පරිසරයේ ගබඩා වේ. ගැටුම් නම් කිරීමේදී විචල්ය පරිසරය ප්රමුඛස්ථානය ගනී.
මෙම බන්ධනය අඩංගු වස්තුව වෙත යොමු වේ. සමහර විට විෂය පථය වෙනස් කිරීමකින් තොරව විෂය පථයන් හෝ ක්රියාත්මක කිරීමේ සන්දර්භයන් වෙනස් වේ, එනම් ප්රකාශිත ශ්රිතයක අඩංගු වස්තුව විය හැකි window
හෝ ඉදිකිරීම් ශ්රිතයක් වැනි.
ඕනෑම වේලාවක පාලනය මාරු කළ විට මෙම ක්රියාත්මක කිරීමේ සන්දර්භයන් නිර්මාණය වේ. කේතය ක්රියාත්මක කිරීමට පටන් ගත් විට පාලනය මාරු වන අතර මෙය මූලික වශයෙන් සිදු කරනුයේ ශ්රිතය ක්රියාත්මක කිරීමෙනි.
එබැවින් තාක්ෂණික පැහැදිලි කිරීම එයයි. ප්රායෝගිකව, JavaScript හි එය මතක තබා ගැනීම වැදගත්ය
මෙම පිටුවේ පෙර උදාහරණ වලින් එකකට (5. "වසා දැමීම") යෙදීමෙන්, ක්රියාත්මක කිරීමේ සන්දර්භයන් අනුගමනය කළ හැකිය. මෙම උදාහරණයේ දී තොගයේ සන්දර්භ තුනක් ඇත. ඒවා නිර්වචනය කරනු ලබන්නේ පිටත සන්දර්භය, var හය ලෙස හැඳින්වෙන ක්ෂණිකව ආයාචිත ශ්රිතයේ සන්දර්භය සහ var හය හි ක්ෂණිකව ආයාචිත ශ්රිතය තුළ ආපසු එන ශ්රිතයේ සන්දර්භය ය.
i ) බාහිර සන්දර්භය. එයට විචල්ය පරිසරයක් ඇත = 1
ii ) IIFE සන්දර්භය, එයට a = 1 හි ශබ්දකෝෂ පරිසරයක් ඇත, නමුත් a = 6 හි විචල්ය පරිසරය, එය තොගයේ ප්රමුඛතාවය ගනී
iii ) ආපසු ලබා දුන් ක්රියාකාරී සන්දර්භය, එයට ශබ්දකෝෂයක් ඇත පරිසරය a = 6 වන අතර එය ඇමතුමේදී ඇඟවීම්වල සඳහන් අගය වේ.
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 එකක් සේම, එය වස්තුවෙන් ආනයනය කරන ලද නම් සම්බන්ධයෙන් ද නොප් එකක් වේ! දැනටමත් නිර්වචනය කර ඇති නමට මඳක් ඉහළට යාම මෙය වඩාත් ආරක්ෂිත කරයි. මේ නිසා මම පෞද්ගලිකව කිසි විටෙකත් භාවිතා නොකරමි.
with
ප්රකාශයක් වේ වාරණ කරුණු නිශ්චය වශයෙන් යම් ආකාරයක නමුත් catch
වගන්ති වඩාත් පොදු ආකෘති පත්රය (විනෝද ඇත්ත, V8 උපකරණ වේ catch
සමඟ with
) - එච්චරමයි JavaScript ම (දී, ශ්රිතයක් වේ ඒ වාරණ කරුණු නිශ්චය එකම ආකාරයේ, ගෝලීය, උත්සාහක / උඩ බව, , සමඟ සහ ඒවායේ ව්යුත්පන්නයන්), කෙසේ වෙතත් ධාරක පරිසරයන්ට විෂය පථය පිළිබඳ විවිධ අදහස් ඇත - නිදසුනක් ලෙස බ්රව්සරයේ පේළිගත සිදුවීම් සහ NodeJS හි vm මොඩියුලය.
ජාවාස්ක්රිප්ට් වෙත අළුත් බොහෝ දෙනෙකුට භාෂාවෙන් උරුමය පෙරනිමියෙන් ලබා ගත හැකි බව තේරුම් ගැනීමට අපහසු බවත්, ක්රියාකාරී විෂය පථය එකම විෂය පථය බවත් මම තේරුම් ගතිමි. මම පසුගිය වසර අවසානයේ JSPretty නමින් ලියූ රූපලාවණ්ය යන්ත්රයකට දිගුවක් ලබා දුන්නා. විශේෂාංග වර්ණ කේතයේ විෂය පථය ක්රියාත්මක වන අතර සෑම විටම එම විෂය පථයේ ප්රකාශිත සියලුම විචල්යයන්ට වර්ණයක් සම්බන්ධ කරයි. එක් විෂය පථයකින් වර්ණයක් සහිත විචල්යයක් වෙනත් විෂය පථයක භාවිතා කරන විට වසා දැමීම දෘශ්යමාන වේ.
මෙහි විශේෂාංගය උත්සාහ කරන්න:
මෙහි නිරූපණයක් බලන්න:
මෙහි කේතය බලන්න:
වර්තමානයේ මෙම විශේෂාංගය කැදැලි 16 ක ගැඹුරක් සඳහා සහය ලබා දෙයි, නමුත් දැනට ගෝලීය විචල්යයන් වර්ණවත් නොකරයි.
ජාවාස්ක්රිප්ට් සතුව ඇත්තේ විෂය පථ දෙකක් පමණි:
var
විචල්යයට ක්රියාකාරී විෂය පථයක් ඇත.ශ්රිතයක් හැඳින්වූ සෑම අවස්ථාවකම විචල්ය විෂය පථයක් නිර්මාණය වන අතර (විෂය පථ දාමයට ඇතුළත් වේ) එය ජාවාස්ක්රිප්ට් හි විචල්යයන් අනුගමනය කරයි.
a = "global";
function outer(){
b = "local";
console.log(a+b); //"globallocal"
}
outer();
විෂය පථය ->
a
සහ outer
ක්රියාකාරිත්වය විෂය පථයේ ඉහළ මට්ටමේ පවතී.variable scope object
(හා විෂය පථ දාමයට ඇතුළත් කර ඇති) ලෙස හඳුන්වන විට b
එය තුළ විචල්යය එකතු වේ .දැන් විචල්යයක් a
අවශ්ය වූ විට එය පළමුව ළඟම විචල්ය විෂය පථය සොයන අතර විචල්යය නොමැති නම් එය විචල්ය විෂය පථයේ ඊළඟ වස්තුව වෙත ගමන් කරයි. මේ අවස්ථාවේ දී කවුළු මට්ටම වේ.
අනෙක් පිළිතුරු වලට එකතු කිරීම සඳහා, විෂය පථය යනු සියලු ප්රකාශිත හඳුනාගැනීම් (විචල්යයන්) පිළිබඳ සොයා බැලීමේ ලැයිස්තුවක් වන අතර, දැනට ක්රියාත්මක වන කේතයට මේවා ප්රවේශ විය හැකි ආකාරය පිළිබඳ දැඩි නීති මාලාවක් ක්රියාත්මක කරයි. මෙම විමසුම විචල්යයට පැවරීමේ අරමුණු සඳහා විය හැකිය, එය LHS (වම් පස) යොමුවකි, නැතහොත් එය RHS (දකුණු පස) යොමු කිරීමක් වන එහි අගය ලබා ගැනීමේ අරමුණු සඳහා විය හැකිය. මෙම සොයාගැනීම් යනු කේතය සම්පාදනය කර ක්රියාත්මක කිරීමේදී ජාවාස්ක්රිප්ට් එන්ජිම අභ්යන්තරව කරන්නේ කුමක්ද යන්නයි.
ඉතින් මෙම දෘෂ්ටිකෝණයෙන් බලන කල, කයිල් සිම්ප්සන් විසින් රචිත විෂය පථයන් සහ වසා දැමීම් පොතෙහි මා සොයාගත් පින්තූරයක් උපකාරී වනු ඇතැයි මම සිතමි.
ඔහුගේ විද්යුත් පොතෙන් උපුටා දැක්වීම:
ගොඩනැගිල්ල අපගේ වැඩසටහනේ කැදැලි විෂය පථය නියෝජනය කරයි. ගොඩනැගිල්ලේ පළමු මහල ඔබ කොතැනක සිටියත් දැනට ක්රියාත්මක වන විෂය පථය නියෝජනය කරයි. ගොඩනැගිල්ලේ ඉහළම මට්ටම ගෝලීය විෂය පථයයි. ඔබගේ වර්තමාන මහල දෙස බැලීමෙන් ඔබ LHS සහ RHS යොමු කිරීම් නිරාකරණය කරන අතර, ඔබට එය සොයාගත නොහැකි නම්, සෝපානය ඊළඟ මහලට ගෙන යාම, එහි බැලීම, ඊළඟට සහ යනාදිය. ඔබ ඉහළ තට්ටුවට ගිය පසු (ගෝලීය විෂය පථය), එක්කෝ ඔබ සොයන දේ ඔබ සොයා ගනී, නැතහොත් නැත. නමුත් ඔබ නොසලකා නතර කළ යුතුය.
සඳහන් කළ යුතු වටිනාම කරුණක් නම්, “පළමු තරගය සොයාගත් පසු විෂය පථය බැලීම නතර වේ”.
"විෂය පථ මට්ටම්" පිළිබඳ මෙම අදහස පැහැදිලි කරන්නේ කැදැලි ශ්රිතයක් දෙස බැලුවහොත් "මෙය" අලුතින් සාදන ලද විෂය පථයකින් වෙනස් කළ හැක්කේ මන්ද යන්නයි. මෙන්න මේ සියලු විස්තර වලට සම්බන්ධ වන සබැඳියක්, ඔබට ජාවාස්ක්රිප්ට් විෂය පථය ගැන දැන ගැනීමට අවශ්ය සියල්ල
කේතය ධාවනය කරන්න. මෙය විෂය පථය පිළිබඳ අදහසක් ලබා දෙනු ඇතැයි සිතමි
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);
ගෝලීය විචල්යයන් හරියටම ගෝලීය තරු හා සමානයි (ජැකී චෑන්, නෙල්සන් මැන්ඩෙලා). ඔබගේ යෙදුමේ ඕනෑම කොටසකින් ඔබට ඒවාට ප්රවේශ විය හැකිය (අගය ලබා ගන්න හෝ සකසන්න). ගෝලීය කාර්යයන් ගෝලීය සිදුවීම් (අලුත් අවුරුදු, නත්තල්) වැනි ය. ඔබගේ යෙදුමේ ඕනෑම කොටසකින් ඔබට ඒවා ක්රියාත්මක කළ හැකිය (අමතන්න).
//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
විෂය පථය පිළිබඳ ගැඹුරු අවබෝධයක් සඳහා මෙම ලිපිය පරීක්ෂා කරන්න
ජාවාස්ක්රිප්ට් විෂය පථයන් දෙකක් පමණක් තිබේ:
එබැවින්, කාර්යයන් හැර වෙනත් කිසිදු වාරණයක් නව විෂය පථයක් නිර්මාණය නොකරයි. 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
පළමු උදාහරණයේ දී බ්ලොක් විෂය පථයක් නොතිබූ බැවින් මුලින් ප්රකාශයට පත් කළ විචල්යයන් නැවත ලියනු ලැබීය. දෙවන උදාහරණයේ දී, ශ්රිතය හේතුවෙන් නව විෂය පථයක් ඇති බැවින් මුලින් ප්රකාශයට පත් කරන ලද විචල්යයන් සෙවනැලි කරන ලද අතර නැවත ලියනු නොලැබේ.
ජාවාස්ක්රිප්ට් විෂය පථය අනුව ඔබ දැනගත යුතු සියල්ලම එයයි.
එබැවින් ජාවාස්ක්රිප්ට් විෂය පථය සැබවින්ම අතිශය සරල බව ඔබට දැක ගත හැකිය. දැනුවත් විය යුතු කරුණු කිහිපයක්:
එබැවින් මෙම කේතය:
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);
මෙය ප්රතිභානීය බවක් පෙනෙන්නට තිබුණත්, එය අත්යවශ්ය භාෂා නිර්මාණකරුවෙකුගේ දෘෂ්ටිකෝණයෙන් අර්ථවත් කරයි.
const
' සහ ' let
'අනෙකුත් බොහෝ ප්රධාන භාෂාවන් මෙන් ඔබ නිර්මාණය කරන සෑම විචල්යයක් සඳහාම බ්ලොක් විෂය පථය භාවිතා කළ යුතුය. var
වන යල් පැන ගිය . මෙය ඔබගේ කේතය ආරක්ෂිත සහ වඩා නඩත්තු කළ හැකිය.
const
95% ක් සඳහා භාවිතා කළ යුතුය . එමඟින් එය විචල්ය යොමුව වෙනස් කළ නොහැක. අරාව, වස්තුව සහ DOM නෝඩ් ගුණාංග වෙනස් විය හැකි අතර එසේ විය යුතුය const
.
let
නැවත පැවරීමට අපේක්ෂා කරන ඕනෑම විචල්යයක් සඳහා භාවිතා කළ යුතුය. මෙය සඳහා ලූපයක් තුළ ඇතුළත් වේ. ආරම්භයෙන් ඔබ්බට ඔබ කවදා හෝ අගය වෙනස් කරන්නේ නම්, භාවිතා කරන්න let
.
වාරණ විෂය පථය යනු විචල්යය ලබා ගත හැක්කේ එය ප්රකාශිත වරහන් තුළ පමණි. මෙය ඔබගේ විෂය පථය තුළ නිර්මාණය කරන ලද නිර්නාමික කාර්යයන් ඇතුළුව අභ්යන්තර විෂය පථයන් දක්වා විහිදේ.
මෙම කුතුහලය දනවන උදාහරණය උත්සාහ කරන්න. පහත උදාහරණයේ දී, 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());
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);
විෂය පථ 3 ක් ඇති බව මගේ අවබෝධයයි: ගෝලීය විෂය පථය, ගෝලීය වශයෙන් ලබා ගත හැකිය; දේශීය විෂය පථය, කුට්ටි නොසලකා සම්පූර්ණ කාර්යයක් සඳහා ලබා ගත හැකිය; සහ අවහිර කිරීමේ විෂය පථය, එය භාවිතා කළ වාරණය, ප්රකාශය හෝ ප්රකාශනය සඳහා පමණි. ගෝලීය සහ දේශීය විෂය පථය 'var' යන පදය සමඟ, ශ්රිතයක් තුළ හෝ ඉන් පිටත දක්වා ඇති අතර, බ්ලොක් විෂය පථය 'ඉඩ දෙන්න' යන මූල පදය සමඟ දක්වනු ලැබේ.
ගෝලීය සහ දේශීය විෂය පථයක් පමණක් ඇතැයි විශ්වාස කරන අයට, කරුණාකර මොසිල්ලාට ජේඑස් හි බ්ලොක් විෂය පථයේ සූක්ෂ්මතාවයන් විස්තර කරන සම්පූර්ණ පිටුවක් ඇත්තේ මන්දැයි පැහැදිලි කරන්න.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
ඉදිරිපස කේත රචකයන් බොහෝ විට ක්රියාත්මක වන බව තවමත් විස්තර කර නොමැති ඉතා පොදු ගැටළුවක් වන්නේ HTML හි පේළිගත සිදුවීම් හසුරුවන්නෙකුට පෙනෙන විෂය පථයයි - නිදසුනක් ලෙස
<button onclick="foo()"></button>
on*
ගුණාංගයකට යොමු කළ හැකි විචල්යයන්ගේ විෂය පථය විය යුත්තේ:
querySelector
ස්වාධීන විචල්යයක් ලෙස දක්වනු ඇත document.querySelector
; දුර්ලභ)එසේ නොමැතිනම්, හසුරුවන්නාට ආයාචනා කළ විට ඔබට විමර්ශන දෝෂයක් ලැබෙනු ඇත. උදාහරණයක් ලෙස, පේළිගත කිරීමේ හසුරුවන්නා විසින් ඇතුළත අර්ථ දක්වා ඇති ශ්රිතයක් ගැන සඳහන් කරන්නේ නම් window.onload
හෝ $(function() {
යොමු කිරීම අසාර්ථක වනු ඇත, මන්ද පේළිගත හසුරුවන්නාට ගෝලීය විෂය පථයේ විචල්යයන් පමණක් සඳහන් කළ හැකි අතර ශ්රිතය ගෝලීය නොවේ:
පිළිබඳ ගුණ document
සහ මූලද්රව්යයක ගුණ හසුරුවන්නා පේළිගත පේනු පළ කළහ නිසා පේළිගත පේනු තුල නවීන විචල්ය ලෙස ද පරිශිලකයන්ට ඉඩ අනුයුක්තව සේවය කරන තුල දෙකක with
කොටස් , සඳහා එක් document
වූ අංගයක් ලෙස, එක්. මෙම හසුරුවන්නන් තුළ ඇති විචල්යයන්ගේ විෂය පථය අතිශයින්ම නොදැනුවත්වම ක්රියාත්මක වන අතර, වැඩ කරන සිදුවීම් හසුරුවන්නෙකුට බොහෝ විට ශ්රිතයක් ගෝලීය වීමට අවශ්ය වනු ඇත (අනවශ්ය ගෝලීය දූෂණය වළක්වා ගත යුතුය ).
පේළිගත හසුරුවන්නන් තුළ ඇති විෂය පථය ඉතා අමුතු නිසාත්, පේළිගත හසුරුවන්නන්ට ගෝලීය දූෂණය වැඩ කිරීමට අවශ්ය නිසාත්, පේළි හසුරුවන්නන් සමහර විට තර්ක ඉදිරිපත් කිරීමේදී කැත නූල් ගැලවී යා යුතු නිසාත්, ඒවා වළක්වා ගැනීම පහසුය. ඒ වෙනුවට, addEventListener
HTML සලකුණු සමඟ නොව ජාවාස්ක්රිප්ට් භාවිතයෙන් සිදුවීම් හසුරුවන්නන් අමුණන්න .
වෙනත් සටහනක, <script>
ඉහළ මට්ටමේ ධාවනය වන සාමාන්ය ටැග් මෙන් නොව , ES6 මොඩියුල තුළ ඇති කේතය එහි පුද්ගලික විෂය පථය තුළ ක්රියාත්මක වේ. සාමාන්ය <script>
ටැගයක ඉහළින් අර්ථ දක්වා ඇති විචල්යයක් ගෝලීය බැවින් ඔබට එය වෙනත් <script>
ටැග් වල සඳහන් කළ හැකිය :
නමුත් ES6 මොඩියුලයක ඉහළ මට්ටම ගෝලීය නොවේ . ES6 මොඩියුලයක ඉහළින් ප්රකාශිත විචල්යයක් දෘශ්ය වන්නේ එම මොඩියුලය තුළ පමණි, විචල්යය පැහැදිලිව export
සංස්කරණය නොකළහොත් හෝ එය ගෝලීය වස්තුවක දේපලකට පවරා නොමැති නම් පමණි.
ES6 මොඩියුලයක ඉහළ මට්ටම සාමාන්යයෙන් ඉහළ මට්ටමේ IIFE හි අභ්යන්තරයට සමාන වේ <script>
. මොඩියුලයට ගෝලීය වන ඕනෑම විචල්යයන් යොමු කළ හැකි අතර මොඩියුලය ඒ සඳහා පැහැදිලිව නිර්මාණය කර ඇත්නම් මිස මොඩියුලය තුළ කිසිවක් සඳහන් කළ නොහැක.
ජාවාස්ක්රිප්ට් හි විෂය පථ දෙකක් තිබේ:
පහත ශ්රිතයට දේශීය විෂය පථ විචල්යයක් 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
}
}
ES5
හා ඉන් පෙර:ජාවාස්ක්රිප්ට් හි විචල්යයන් මුලදී (පෙර ES6
) ශබ්දකෝෂයෙන් ක්රියා කරන ලදි. ශබ්දකෝෂයෙන් විෂය පථය යන්නෙන් අදහස් කරන්නේ ඔබට කේතය දෙස බැලීමෙන් විචල්යයන්ගේ විෂය පථය දැකිය හැකි බවයි.
var
මූල පදය සමඟ ප්රකාශිත සෑම විචල්යයක්ම ශ්රිතයට පරික්ෂා කෙරේ. කෙසේ වෙතත්, එම ශ්රිතය තුළ වෙනත් ශ්රිතයක් ප්රකාශයට පත් කළ හොත් එම ශ්රිතයන්ට බාහිර ශ්රිතයන්ගේ විචල්යයන්ට ප්රවේශය ලැබේ. මෙය විෂය පථ දාමයක් ලෙස හැඳින්වේ . එය පහත පරිදි ක්රියා කරයි:
// 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
කොන්සෝලය වෙත පහත සඳහන් වේ:
innerFunc
තුළම සොයාගත හැකිය. එමනිසා, foo හි අගය නූලට නිරාකරණය වේ innerFunc
.innerFunc
තුළම තීරුව සොයාගත නොහැක . එබැවින්, අපි විෂය පථය තරණය කළ යුතුය. අපි පළමුව බලන්නේ ශ්රිතය innerFunc
අර්ථ දක්වා ඇති බාහිර ශ්රිතයෙනි. මෙය ශ්රිතයයි outerFunc
. විෂය පථය තුළ outerFunc
අපට 'පිටත ෆන්ක්' නූල රඳවා ඇති විචල්ය තීරුව සොයාගත හැකිය.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 එකෙන් පිටත ප්රවේශ විය නොහැක.
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.
}
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
පිළිගත් පිළිතුරට මම ඇත්තෙන්ම කැමතියි නමුත් මට මෙය එකතු කිරීමට අවශ්යයි:
විෂය පථය විසින් ප්රකාශිත සියලුම හඳුනාගැනීම් (විචල්යයන්) පිළිබඳ ලැයිස්තුවක් එකතු කර පවත්වාගෙන යන අතර දැනට ක්රියාත්මක වන කේතයට මේවා ප්රවේශ විය හැකි ආකාරය පිළිබඳ දැඩි නීති මාලාවක් ක්රියාත්මක කරයි.
විෂය පථය යනු ඒවායේ හඳුනාගැනීමේ නාමයෙන් විචල්යයන් සොයා බැලීමේ නීති මාලාවකි.
ජාවාස්ක්රිප්ට් හි විෂය පථයන් දෙකක් තිබේ.
ගෝලීය විෂය පථය : ගෝලීය විෂය පථයෙන් ප්රකාශයට පත් කරන ලද විචල්යය වැඩසටහනේ ඕනෑම තැනක ඉතා පහසුවෙන් භාවිතා කළ හැකිය. උදාහරණයක් වශයෙන්:
var carName = " BMW";
// code here can use carName
function myFunction() {
// code here can use carName
}
ක්රියාකාරී විෂය පථය හෝ දේශීය විෂය පථය : මෙම විෂය පථයේ ප්රකාශිත විචල්යය භාවිතා කළ හැක්කේ එහි ශ්රිතයට පමණි. උදාහරණයක් වශයෙන්:
// code here can not use carName
function myFunction() {
var carName = "BMW";
// code here can use carName
}