سؤال

ولدي شيئا من هذا القبيل:

var Something = function(){
  this.render = function(){};
  $(window).resize(function(){
    this.render();
  });
}

والمشكلة هي أن داخل وظيفة مجهول "هذا" يشير إلى كائن الإطار. وأنا أعلم أنني يمكن أن تفعل شيئا مثل:

var Something = function(){
  this.render = function(){};
  var tempThis = this;
  $(window).resize(function(){
    tempThis.render();
  });
}

ولكن هناك طريقة أفضل؟ هذا لا تبدو أنيقة جدا.

هل كانت مفيدة؟

المحلول

والحل هل وجدت هو استخدام واحد لمعظم الناس. الاتفاقية المشتركة لاستدعاء tempThis بك متغير "ذلك".

var Something = function(){
  this.render = function(){};
  var that = this;
  $(window).resize(function(){
    that.render();
  });
};

نصائح أخرى

وهذا يبدو وكأنه الخيار الأفضل لك، وأنا لا أعتقد أن هناك طريقة أفضل. (شخص ما يصحح لي إذا كنت مخطئا).

ومعلوماتك القدرة على السيطرة على هذا يأتي في في الإصدار التالي من مسج

ولقد تم القيام به بهذه الطريقة في كثير من المواقف الصعبة. أنها لا تبدو أنيقة، ولكنها لا يفشل أبدا. أن يكون فعلا جافا سكريبت إغلاق في العمل.

وJRH

وهذا هو بالضبط ما أقوم به. انها ليست محددة لمسج، إما.

var Construct = function() {
    var self = this; //preserve scope

    this.materials = 2000;

    this.build = function(){
        self.materials -= 100;
    };
};

وتذكر أن استخدام الكلمة فار أمام لديك متغير النطاق الجديد. خلاف ذلك، كنت تقوم بإنشاء متغير عالمي جديد. كما متغير محلي، وسوف يكون لا يزال الوصول إليها داخل الدالة الداخلية عن طريق الإغلاق.

وأفضل حل، للحفاظ على متغيرات على الأقل سيكون لاستخدام أسلوب Function.prototype.bind ().

var Something = function(){
  this.render = function(){};
  $(window).resize( this.render.bind( this ) );
}

والمشكلة مع هذه الطريقة التي يمكن أن تسبب مضاعفات في المستقبل، وهو ما يعني يجب عليك أن تختار لاستخدامها لماما، وعندما كنت في حاجة لاستدعاء $(this) للاستيلاء على العنصر. لذلك، وأنا قد تشير إلى أنه سيكون من المفيد استخدام Function.prototype.bind() في طريقة تغيير حجم الخاصة بك، ولكن ذلك لن يكون حلا جيدا لاستخدامه في وظيفة فوق ذلك قد تحتاج لاستهداف العنصر الذي تم النقر عليه مباشرة.

JSFiddle للحصول على مثال العمل.

الوثائق موزيلا على Function.prototype .bind () للحصول على مزيد من المعلومات

وأساليب أخرى صالحة للاستعمال، ولكن خلق المتغير للحفاظ على سياق هذا هو أثر غير مرغوب فيه وفقا لسؤالك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top