2014-07-08 2 views
-1

У меня есть простая функция, которая является членом класса, ImageUtils, который загружает изображение:Как сохранить объем функции обратного вызова в JavaScript,

this.loadSingleImage = function(path, callbackComplete, callbackFail) 
{ 
    var img = new Image(); 
    img.src = path; 

    img.onload = callbackComplete; 
    img.onerror = callbackFail; 

    return img; 
} 

Я пытаюсь понять, как быть в состоянии получить доступ переменные вне области функции обратного вызова, из функции обратного вызова. Я читал по вызову() и apply(), но ничто из этого не имеет для меня смысла в отношении функции выше. В настоящий момент область функции обратного вызова - ImageUtils. Мне нужно, чтобы он был тем же масштабом, что и я называл ImageUtils.loadSingleImage().


Изменить, чтобы указать дополнительные данные:

Рассмотрим следующий пример:

var Image_Utils = new function() 
{ 
    this.loadSingleImage = function(path, callbackComplete, callbackFail) 
    { 
     var img = new Image(); 
     img.src = path; 
     trace(' load image: ' + path); 

     img.onload = callbackComplete; 
     img.onerror = callbackFail; 

     return img; 
    } 
} 

var SomeOtherClass = new function() 
{ 
    this.init = function() 
    { 
     Image_Utils.loadSingleImage('somepath', SomeOtherClass.onImageLoaded, SomeOtherClass.onImageFailed); 
    } 

    this.onImageLoaded = function() 
    { 
     // console.log(this); 
     // returns Img, not SomeOtherClass 
     // why? 
    } 

    this.onImageFailed = function() 
    { 
     // console.log(this); 
     // returns Img, not SomeOtherClass 
     // why? 
    } 
} 
+1

Функция scope зависит от того, где вы определяете функцию, а не там, где вы ее называете. – dandavis

+0

, вы не можете сделать это из кода, который вы предоставили, это нужно было бы сделать, когда вы передадите (и/или определите) обратный вызов. –

+0

вы можете запомнить аргументы и проксировать их для обратного вызова с помощью bind(): img.onload = callbackComplete.bind (this, path, img), где полная функция имеет путь и формальные параметры img. – dandavis

ответ

0

Вы можете попробовать это: -

this.loadSingleImage = function(path, callbackComplete, callbackFail) 
    { 
    var me = this, 
    me.img = new Image(); 
    me.img.src = path; 

    me.img.onload = callbackComplete.bind(me); 
    me.img.onerror = callbackFail.bind(me); 

    return img; 
    } 
+0

Примечание: jQuery/Zepto/etc. еще не упомянуты. Вы должны объяснить любые дополнительные зависимости, которые использует ваш ответ, или предположить, что они недоступны для OP. –

+0

Благодарим за попытку ответить на мой вопрос тем, что было предоставлено. Я ценю это. JQuery не является вариантом для моих потребностей проекта. Мне нужно использовать прямой JS. – Ribs

+0

Затем вы можете использовать собственный метод bind() для js – Indra

0

Это все зависит от того, где вы» re определяет функцию /, вызывающую ее. Вот небольшой пример некоторых областей. Я предполагаю, что в вашем примере вы захотите получить доступ к чему-то вроде переменной b.

// Global variable 
var c = "C"; 

// Anonymous function. Both b and myFunc are in the same scope 
(function() { 
    var b = "B";  
    var myFunc= function(a) { 
     console.log(a); // logs A which is a parameter 
     console.log(b); // logs B as this function is defined in the same scope 
     console.log(c); // logs C as this is a global variable 
     console.log(d); // logs undefined as it's defined in a different function scope 
    }; 

    myFunc("A");  
})(); 

// Anonymous function. Different scope to the previous one 
(function() { 
    var d = "D"; 
})(); 
Смежные вопросы