ECMAScript ਕਲੌਜ਼

ECMAScript ਦਾ ਸਭ ਤੋਂ ਗਲਤ ਸਮਝਿਆ ਜਾਣ ਵਾਲਾ ਇੱਕ ਪ੍ਰਕਾਰ ਹੈ ਕਿ ਇਹ ਕਲੌਜ਼ (closure) ਸਮਰਥਨ ਕਰਦਾ ਹੈ。

闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。

ਸਧਾਰਨ ਬੰਦਲੇ ਦਾ ਉਦਾਹਰਣ

ECMAScript ਵਿੱਚ ਗਲੋਬਲ ਮੁੱਲ ਦੀ ਵਰਤੋਂ ਇੱਕ ਸਧਾਰਨ ਬੰਦਲੇ ਦਾ ਉਦਾਹਰਣ ਹੈ। ਹੇਠ ਲਿਖੇ ਕੋਡ ਨੂੰ ਸੋਚੋ:

var sMessage = "hello world";
function sayHelloWorld() {
  alert(sMessage);
}
sayHelloWorld();

ਉਸ ਸਕ੍ਰਿਪਟ ਵਿੱਚ, ਜਦੋਂ ਸਕ੍ਰਿਪਟ ਮੈਮੋਰੀ ਵਿੱਚ ਲੋਡ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਫੰਕਸ਼ਨ sayHelloWorld() ਵਿੱਚ ਮੁੱਲ sMessage ਦੀ ਗਿਣਤੀ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ ਫੰਕਸ਼ਨ ਸਿਰਫ ਭਵਿੱਖ ਵਿੱਚ ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਲਈ sMessage ਦਾ ਮੁੱਲ ਕੈਪਚਰ ਕਰਦਾ ਹੈ, ਯਾਨੀ ਪਰਿਭਾਸ਼ਕ ਜਾਣਦਾ ਹੈ ਕਿ ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ sMessage ਦਾ ਮੁੱਲ ਜਾਂਚ ਕੀਤਾ ਜਾਵੇਗਾ। sMessage ਫੰਕਸ਼ਨ sayHelloWorld() ਦੀ ਵਰਤੋਂ ਕਰਨ ਉੱਤੇ (ਆਖਰੀ ਲਾਈਨ) ਮੁੱਲ ਦੇ ਰੂਪ ਵਿੱਚ ਅਪਡੇਟ ਕੀਤਾ ਜਾਵੇਗਾ, "hello world" ਸੰਦੇਸ਼ ਦਿਖਾਇਆ ਜਾਵੇਗਾ。

ਜਟਿਲ ਬੰਦਲੇ ਦਾ ਉਦਾਹਰਣ

ਇੱਕ ਫੰਕਸ਼ਨ ਵਿੱਚ ਦੂਜੇ ਫੰਕਸ਼ਨ ਨੂੰ ਦਫ਼ਤਰ ਕਰਨਾ ਬੰਦਲੇ ਨੂੰ ਬਹੁਤ ਜਟਿਲ ਕਰ ਦਿੰਦਾ ਹੈ। ਉਦਾਹਰਣ ਵਜੋਂ:

var iBaseNum = 10;
function addNum(iNum1, iNum2) {
  function doAdd() {
    return iNum1 + iNum2 + iBaseNum;
  }
  return doAdd();
}

ਇੱਥੇ, function addNum() ਫੰਕਸ਼ਨ doAdd() (ਬੰਦਲੇ) ਨੂੰ ਸ਼ਾਮਲ ਕਰਦਾ ਹੈ। ਅੰਦਰੂਨੀ ਫੰਕਸ਼ਨ ਇੱਕ ਬੰਦਲਾ ਹੈ, ਕਿਉਂਕਿ ਉਹ ਬਾਹਰੀ ਫੰਕਸ਼ਨ ਦੇ ਪੈਰਾਮੀਟਰ iNum1 ਅਤੇ iNum2 ਅਤੇ ਗਲੋਬਲ ਮੁੱਲ iBaseNum ਦਾ ਮੁੱਲ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ। addNum() ਦਾ ਆਖਰੀ ਕਦਮ doAdd() ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ, ਦੋ ਪੈਰਾਮੀਟਰ ਅਤੇ ਗਲੋਬਲ ਮੁੱਲ ਨੂੰ ਜੋੜਦਾ ਹੈ ਅਤੇ ਉਨ੍ਹਾਂ ਦਾ ਸਮਾਨਤਾ ਵਾਪਸ ਦਿੰਦਾ ਹੈ。

ਮਹੱਤਵਪੂਰਨ ਵਿਚਾਰ ਇਹ ਹੈ ਕਿ doAdd() ਫੰਕਸ਼ਨ ਕੋਈ ਪੈਰਾਮੀਟਰ ਨਹੀਂ ਸਵੀਕਾਰ ਕਰਦਾ ਹੈ, ਉਹ ਵਰਤਾਉਣ ਵਾਲੀ ਮੁੱਲ ਨੂੰ ਚਲਾਉਣ ਵਾਲੇ ਮਾਹੌਲ ਤੋਂ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ。

ਇਹ ਦੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ ਕਿ ਬੰਦਲੇ ECMAScript ਵਿੱਚ ਬਹੁਤ ਮਜ਼ਬੂਤ ਅਤੇ ਵਿਸ਼ੇਸ਼ ਹਿੱਸੇ ਹਨ, ਜੋ ਜਟਿਲ ਕੈਲਕੁਲੇਸ਼ਨ ਲਈ ਵਰਤੇ ਜਾ ਸਕਦੇ ਹਨ。

ਸੁਝਾਅ:ਕਿਸੇ ਵੀ ਉੱਚ ਪੱਧਰੀ ਫੰਕਸ਼ਨ ਦੀ ਤਰ੍ਹਾਂ, ਬੰਦਲਾਂ ਦੀ ਵਰਤੋਂ ਵਿੱਚ ਧਿਆਨ ਰੱਖੋ, ਕਿਉਂਕਿ ਉਹ ਬਹੁਤ ਜ਼ਿਆਦਾ ਜਟਿਲ ਹੋ ਸਕਦੇ ਹਨ。