ای سی ایم اسکریپت اوبجیکٹ اسکوپ

ਕਾਰਜਮੰਡਲ ਨੂੰ ਵਰਤਾਰੇ ਦੇ ਦਾਇਰੇ ਕਹਿੰਦੇ ਹਨ।

ਜਨਤਕ, ਨਿੱਜੀ ਅਤੇ ਸੁਰੱਖਿਅਤ ਕਾਰਜਮੰਡਲ

ਵਿਚਾਰ

ਰਵਾਇਤੀ ਮੁਕਾਬਲੇਬਾਜ਼ੀ ਪ੍ਰੋਗਰਾਮਿੰਗ ਵਿੱਚ, ਮੁੱਖ ਧਿਆਨ ਜਨਤਕ ਅਤੇ ਨਿੱਜੀ ਕਾਰਜਮੰਡਲ 'ਤੇ ਹੈ।ਜਨਤਕ ਕਾਰਜਮੰਡਲ ਵਿੱਚ ਦੇ ਵਸਤੂ ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਬਾਹਰੀ ਤੌਰ 'ਤੇ ਪਹੁੰਚਯੋਗ ਹਨ, ਯਾਨੀ ਜਦੋਂ ਵਿਕਾਸਕਾਰ ਨੇ ਵਸਤੂ ਦਾ ਇੱਕ ਉਦਾਹਰਣ ਬਣਾਇਆ ਹੈ ਤਾਂ ਉਹ ਉਸ ਦੀਆਂ ਜਨਤਕ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਉਪਯੋਗ ਕਰ ਸਕਦਾ ਹੈ।ਨਿੱਜੀ ਕਾਰਜਮੰਡਲ ਵਿੱਚ ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨਾਲ ਕੇਵਲ ਵਸਤੂ ਦੇ ਅੰਦਰ ਪਹੁੰਚਯੋਗ ਹਨ, ਯਾਨੀ ਬਾਹਰੀ ਦੁਨੀਆ ਲਈ ਇਹ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਮੌਜੂਦ ਨਹੀਂ ਹਨ।ਇਹ ਮਤਲਬ ਹੈ ਕਿ ਜੇਕਰ ਕਿਸੇ ਵਸਤੂ ਨੇ ਨਿੱਜੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਮੱਥਾਬੰਦੀਆਂ ਦਾ ਪਰਿਭਾਸ਼ਾ ਕੀਤਾ ਹੈ ਤਾਂ ਉਸ ਦੇ ਉਪ ਵਸਤੂਆਂ ਵੀ ਉਨ੍ਹਾਂ ਨੂੰ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕਦੇ।

ਸੁਰੱਖਿਅਤ ਕਾਰਜਮੰਡਲ ਵੀ ਨਿੱਜੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਮੱਥਾਬੰਦੀਆਂ ਦੀ ਪਰਿਭਾਸ਼ਾ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਪਰ ਇਹ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਮੱਥਾਬੰਦੀਆਂ ਉਸ ਦੇ ਉਪ ਵਸਤੂਆਂ ਦੁਆਰਾ ਵੀ ਪਹੁੰਚਯੋਗ ਹਨ。

ECMAScript ਕੇਵਲ ਜਨਤਕ ਕਾਰਜਮੰਡਲ ਹੈ

ECMAScript ਵਿੱਚ ਉੱਪਰੋਕਤ ਕਾਰਜਮੰਡਲ ਨੂੰ ਚਰਚਾ ਕਰਨਾ ਕਿਤੇ ਕੋਈ ਮਹੱਤਵ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ECMAScript ਵਿੱਚ ਕੇਵਲ ਇੱਕ ਕਾਰਜਮੰਡਲ ਹੈ - ਜਨਤਕ ਕਾਰਜਮੰਡਲ।ECMAScript ਦੇ ਸਾਰੇ ਬਾਹਰੀ ਵਸਤੂਆਂ ਦੀਆਂ ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਮੱਥਾਬੰਦੀਆਂ ਜਨਤਕ ਹਨ।ਇਸ ਲਈ, ਆਪਣੀਆਂ ਵਸਤੂਆਂ ਅਤੇ ਬਾਹਰੀ ਵਸਤੂਆਂ ਦੀ ਪਰਿਭਾਸ਼ਾ ਕਰਦੇ ਹੋਏ, ਖਾਸੇ ਧਿਆਨ ਦੇਣਾ ਚਾਹੀਦਾ ਹੈ।ਯਾਦ ਰੱਖੋ ਕਿ ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਮੱਥਾਬੰਦੀਆਂ ਡਿਫਾਲਟ ਤੌਰ 'ਤੇ ਜਨਤਕ ਹਨ!

ਸੁਝਾਵਨਾਤਮਕ ਹੱਲ

ਕਈ ਵਿਕਾਸਕਾਰ ਨੇ ਇੰਟਰਨੈੱਟ 'ਤੇ ਇਸ ਪ੍ਰਕਾਰ ਦੇ ਵਿਸ਼ੇਸ਼ਤਾ ਕਾਰਜਮੰਡਲ ਮੋਡਲ ਪੇਸ਼ ਕੀਤੇ ਹਨ ਜਿਹੜੇ ECMAScript ਦੀ ਇਸ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕਰਦੇ ਹਨ。

ਨਿੱਜੀ ਕਾਰਜਮੰਡਲ ਖੋਲ੍ਹੇ ਨਾ ਹੋਣ ਕਰਕੇ, ਵਿਕਾਸਕਾਰ ਨੇ ਇੱਕ ਨਿਯਮ ਤੈਅ ਕੀਤਾ ਹੈ ਕਿ ਕਿਹੜੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਕਿਹੜੇ ਮੱਥਾਬੰਦੀਆਂ ਨੂੰ ਨਿੱਜੀ ਮੰਨਣਾ ਚਾਹੀਦਾ ਹੈ।ਇਹ ਨਿਯਮ ਕਹਿੰਦਾ ਹੈ ਕਿ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦੇ ਸਾਹਮਣੇ ਅਤੇ ਪਿੱਛੇ ਨਿਸ਼ਾਨ ਲਗਾਓ:

obj._color_ = "blue";

ਇਸ ਕੋਡ ਵਿੱਚ, ਵਿਸ਼ੇਸ਼ਤਾ color ਨੂੰ ਨਿੱਜੀ ਮੰਨਿਆ ਗਿਆ ਹੈ।ਧਿਆਨ ਦੇਵੋ ਕਿ ਨਿਸ਼ਾਨ ਨਾਲ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਨਿੱਜੀ ਵਿਸ਼ੇਸ਼ਤਾ ਨਹੀਂ ਬਣਾਉਂਦਾ, ਉਹ ਸਿਰਫ਼ ਹੋਰ ਵਿਕਾਸਕਾਰਾਂ ਨੂੰ ਦੱਸਦਾ ਹੈ ਕਿ ਉਹ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਨਿੱਜੀ ਮੰਨਣ ਚਾਹੀਦੇ ਹਨ।

有些开发者还喜欢用单下划线说明私有成员,例如:obj._color。

静态作用域

静态作用域定义的属性和方法任何时候都能从同一位置访问。在 Java 中,类可具有属性和方法,无需实例化该类的对象,即可访问这些属性和方法,例如 java.net.URLEncoder 类,它的函数 encode() 就是静态方法。

ECMAScript 没有静态作用域

严格来说,ECMAScript 并没有静态作用域。不过,它可以给构造函数提供属性和方法。还记得吗,构造函数只是函数。函数是对象,对象可以有属性和方法。例如:

function sayHello() {
  alert("hello");
}
sayHello.alternate = function() {
  alert("hi");
}
sayHello();		//输出 "hello"
sayHello.alternate();	//输出 "hi"

TIY

这里,方法 alternate() 实际上是函数 sayHello 的方法。可以像调用常规函数一样调用 sayHello() 输出 "hello",也可以调用 sayHello.alternate() 输出 "hi"。即使如此,alternate() 也是 sayHello() 公用作用域中的方法,而不是静态方法。

关键字 this

this 的功能

在 ECMAScript 中,要掌握的最重要的概念之一是关键字 this 的用法,它用在对象的方法中。关键字 this 总是指向调用该方法的对象,例如:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(this.color);
};
oCar.showColor();		// ਨਿਕਾਲ "red"

TIY

在上面的代码中,关键字 this 用在对象的 showColor() 方法中。在此环境中,this 等于 oCar。下面的代码与上面的代码的功能相同:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(oCar.color);
};
oCar.showColor();		// ਨਿਕਾਲ "red"

TIY

ਇਸਦਾ ਉਪਯੋਗ ਕਰਨ ਦੇ ਕਾਰਨ

ਕੀ ਇਸਦਾ ਉਪਯੋਗ ਕਿਉਂ ਕਰਦੇ ਹਾਂ? ਕਿਉਂਕਿ ਉਦਾਹਰਣ ਵਿੱਚ, ਉਦਾਹਰਣ ਵਜੋਂ ਇੱਕ ਬਾਹਰੀ ਵਿਸ਼ਲੇਸ਼ਣ ਵਿੱਚ ਹਰ ਸਮੇਂ ਲਾਗੂ ਕਰਨ ਵਾਲੇ ਵਾਰਤਕ ਨਾਮ ਨਹੀਂ ਪਤਾ ਹੁੰਦਾ ਹੈ।ਇਸਦੇ ਨਾਲ ਇੱਕ ਫੰਕਸ਼ਨ ਕਿਉਂਕਿ ਕਿਸੇ ਵੀ ਅਨੇਕ ਸਥਾਨਾਂ 'ਤੇ ਇੱਕ ਹੀ ਫੰਕਸ਼ਨ ਦਾ ਉਪਯੋਗ ਕਰ ਸਕਦੇ ਹਨ।ਇਸ ਉਦਾਹਰਣ ਨੂੰ ਸੋਚੋ:

function showColor() {
  alert(this.color);
};
var oCar1 = new Object;
oCar1.color = "red";
oCar1.showColor = showColor;
var oCar2 = new Object;
oCar2.color = "blue";
oCar2.showColor = showColor;
oCar1.showColor();		//ਆਉਟਪੁੱਟ "red"
oCar2.showColor();		//ਆਉਟਪੁੱਟ "blue"

TIY

ਉਪਰੋਕਤ ਕੋਡ ਵਿੱਚ ਪਹਿਲਾਂ ਫੰਕਸ਼ਨ showColor() ਨੂੰ this ਦੇ ਦੁਆਰਾ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਗਿਆ, ਫਿਰ ਦੋ ਆਬਜੈਕਟ (oCar1 ਅਤੇ oCar2) ਬਣਾਏ ਗਏ, ਇੱਕ ਆਬਜੈਕਟ ਦੀ color ਵਿਸ਼ੇਸ਼ਤਾ "red" ਦੇ ਰੂਪ 'ਚ ਸੈਟ ਕੀਤੀ ਗਈ ਹੈ, ਦੂਜੇ ਆਬਜੈਕਟ ਦੀ color ਵਿਸ਼ੇਸ਼ਤਾ "blue" ਦੇ ਰੂਪ 'ਚ ਸੈਟ ਕੀਤੀ ਗਈ ਹੈ। ਦੋਵੇਂ ਆਬਜੈਕਟ ਨੂੰ showColor ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ ਦੇ ਰੂਪ 'ਚ ਦਿੱਤੀ ਗਈ ਹੈ, ਜੋ ਮੂਲੀਗੂਲੀ ਦੀ ਫੰਕਸ਼ਨ showColor() ਨੂੰ ਦਿਸਾਉਂਦੀ ਹੈ (ਇੱਥੇ ਨਾਮ ਦੀ ਸਮਸਿਆ ਨਹੀਂ ਹੈ, ਕਿਉਂਕਿ ਇੱਕ ਗਲੋਬਲ ਫੰਕਸ਼ਨ ਅਤੇ ਦੂਜਾ ਆਬਜੈਕਟ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ ਹੈ)। ਹਰ ਆਬਜੈਕਟ ਦਾ showColor() ਚਾਲੂ ਕੀਤਾ ਜਾਵੇ, oCar1 ਦਾ ਆਉਟਪੁੱਟ "red" ਹੋਵੇਗਾ, ਜਦਕਿ oCar2 ਦਾ ਆਉਟਪੁੱਟ "blue" ਹੋਵੇਗਾ। ਇਹ ਇਸ ਲਈ ਹੋਵੇਗਾ ਕਿ ਜਦੋਂ oCar1.showColor() ਚਾਲੂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਫੰਕਸ਼ਨ ਵਿੱਚ this ਕੀਵਰਡ ਦਾ ਮਾਲਕ oCar1 ਹੈ। ਜਦੋਂ oCar2.showColor() ਚਾਲੂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਫੰਕਸ਼ਨ ਵਿੱਚ this ਕੀਵਰਡ ਦਾ ਮਾਲਕ oCar2 ਹੈ。

ਧਿਆਨ, ਆਬਜੈਕਟ ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਉਲੇਖ ਕਰਨ ਲਈ ਚਾਹੀਦਾ ਹੈ ਕਿ this ਕੀਵਰਡ ਵਰਤਿਆ ਜਾਵੇ। ਉਦਾਹਰਣ ਵਜੋਂ, ਜੇਕਰ ਹੇਠ ਲਿਖੇ ਕੋਡ ਨੂੰ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਤਾਂ showColor() ਮੱਥਦਾ ਨਹੀਂ ਚਲੇਗਾ:

function showColor() {
  alert(color);
};

ਅਗਰ ਆਬਜੈਕਟ ਜਾਂ this ਕੀਵਰਡ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ ਤਾਂ ECMAScript ਉਸਨੂੰ ਸਥਾਨਕ ਜਾਂ ਗਲੋਬਲ ਵੈਰੀਅਬਲ ਦੇ ਤੌਰ 'ਤੇ ਦੇਖੇਗਾ। ਫਿਰ ਇਹ ਫੰਕਸ਼ਨ ਕਲਰ ਨਾਮ ਦਾ ਸਥਾਨਕ ਜਾਂ ਗਲੋਬਲ ਵੈਰੀਅਬਲ ਲੱਭੇਗਾ, ਪਰ ਲੱਭਣ ਵਿੱਚ ਅਸਫਲ ਹੋਵੇਗਾ। ਨਤੀਜਾ ਕੀ ਹੋਵੇਗਾ? ਫੰਕਸ਼ਨ ਵਿੱਚ "null" ਦੇ ਨਾਲ ਚੇਤਾਵਨੀ ਦਿਖਾਈ ਜਾਵੇਗੀ。