شما اینجا هستید

بستارها یکی از قدرتمندترین ویژگیهای جاوا اسکریپت هستند.

جاوااسکریپت به توابع تو در تو و توابع درونی امکان دسترسی کامل به همه متغیرها و توابع تعریف شده در داخل تابع بیرونی (همچنین همه متغیرها و توابعی که تابع بیرونی به آنها دسترسی دارد) را میدهد.

اما، تابع بیرونی به توابع و متغیرهای تعریف شده در تابع درونی دسترسی ندارد. این رویه باعث فراهم شدن یک سری از مسائل امنیتی برای متغیرهای تابع درونی میگردد.

همچنین، تابع درونی به دامنه تابع بیرونی دسترسی دارد. هنگامی که تابع درونی به هر دامنه ای خارج از تابع بیرونی دسترسی پیدا بکند بستار ایجاد میگردد.

var pet = function(name) {   // The outer function defines a variable called "name"
  var getName = function() {
    return name;             // The inner function has access to the "name" variable of the outer function
  }
  return getName;            // Return the inner function, thereby exposing it to outer scopes
},
myPet = pet("Vivie");
   
myPet();                     // Returns "Vivie"

در مثال بالا تابع بیرونی متغیر name را تعریف میکند و تابع درونی به متغیر name تابع بیرونی دسترسی دارد. سپس تابع درونی بازگردانده میشود، در نتیجه در معرض دید تابع بیرونی قرار میگیرد.

کدهای مثال زیر پیچیده تر از کدهای بالا هستند. در این مثال یک شی شامل متدی برای دستکاری متغیرهای درونی که تابع بیرونی میتواند بازبگرداند است.

var createPet = function(name) {
  var sex;
  
  return {
    setName: function(newName) {
      name = newName;
    },
    
    getName: function() {
      return name;
    },
    
    getSex: function() {
      return sex;
    },
    
    setSex: function(newSex) {
      if(typeof newSex == "string" && (newSex.toLowerCase() == "male" || newSex.toLowerCase() == "female")) {
        sex = newSex;
      }
    }
  }
}

var pet = createPet("Vivie");
pet.getName();                  // Vivie

pet.setName("Oliver");
pet.setSex("male");
pet.getSex();                   // male
pet.getName();                  // Oliver

توضیح مثال بالا: در این مثال ما متدی برای ایجاد و ویرایش اشیا نوشته ایم، این متدها میتوانند یک شی را ایجاد و جنسیت و نام آن را دریافت و همچنین بازبگردانند.

در کد بالا، متغیر name در تابع بیرونی برای تابع درونی قابل دسترس است و راهی بجز تابع درونی برای دسترسی به متغیرهای درونی وجود ندارد. متغیرهای درونی تابع درونی مانند یک مکان ذخیره سازی ایمن برای توابع درونی عمل میکند. در عین حال اطلاعات برای بکار گرفته شدن در توابع درونی امن باقی میمانند. حتی نیازی نیست که توابع به یک متغیر اختصاص داده شوند یا نامی داشته باشند.

var getCode = (function(){
  var secureCode = "0]Eal(eh&2";    // A code we do not want outsiders to be able to modify...
  
  return function () {
    return secureCode;
  };
})();

getCode();    // Returns the secureCode

اگر در یک تابع درونی متغیری همنام با متغیر تعریف شده در دامنه بیرونی تعریف بکنیم، راهی برای ارجاع به این متغیر در دامنه بیرونی وجود ندارد.

var createPet = function(name) {  // Outer function defines a variable called "name"
  return {
    setName: function(name) {    // Enclosed function also defines a variable called "name"
      name = name;               // ??? How do we access the "name" defined by the outer function ???
    }
  }
}

ارجاع دادن به این متغیرها کاملا بستگی به مکانی دارد که تابع از آنجا فراخوانی شده است پس از این نوع متغیرها باید با دقت استفاده شود.

افزودن دیدگاه جدید

دیدگاه

  • تگ‌های HTML مجاز: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • خطوط و پاراگراف‌ها بطور خودکار اعمال می‌شوند.
  • نشانی صفحه‌ها وب و پست الکترونیک بصورت خودکار به پیوند تبدیل می‌شوند.

Plain text

  • تگ‌های HTML مجاز نیستند.
  • نشانی صفحه‌ها وب و پست الکترونیک بصورت خودکار به پیوند تبدیل می‌شوند.
  • خطوط و پاراگراف‌ها بطور خودکار اعمال می‌شوند.
كد امنيتي
این پرسش برای جلوگیری از ارسال اسپمهای اتوماتیک است.