访问循环外的对象(javascript)

访问循环外的对象(javascript),javascript,jquery,Javascript,Jquery,为了尊重不受歧视的原则 “污染全局命名空间” 出于其他原因,我发现全局变量“通常”是个坏主意,我从全局变量中插入了代码: stBgAsset15_src = $image.attr('src'); 作为一个初学者,我认为最相关的是,使用“src”属性/方法创建Object Image() var stBgAsset15 = new Image(); stBgAsset15.src = $image.attr('src'); 但我无法在“for”循环之外访问它。我需要能够在循环的外部函数中以及

为了尊重不受歧视的原则

“污染全局命名空间”

出于其他原因,我发现全局变量“通常”是个坏主意,我从全局变量中插入了代码:

stBgAsset15_src = $image.attr('src');
作为一个初学者,我认为最相关的是,使用“src”属性/方法创建
Object Image()

var stBgAsset15 = new Image();
stBgAsset15.src = $image.attr('src');
但我无法在“for”循环之外访问它。我需要能够在循环的外部函数中以及在主外部函数底部引用的名为
ClickOnButton()
的函数中访问它

我收到以下错误消息:

Uncaught ReferenceError: stBgAsset15 is not defined
另外,这是可选的,因为今天不需要它(但将来可能需要),我想知道是否也可以从另一个名为
的函数totalyunrelated()访问它

JSFIDLE上的完整演示

为了能够访问变量,我在每个地方都放置了
console.log
提示

这里的循环不是功能性的,只是为了讨论范围和实现这一点的最佳方法

代码:

preloadFirstPriorityStAssets();

var $image = $('#intro').find('#Asset-15');

function preloadFirstPriorityStAssets() {

   // Variables
    var i,
        s;    
    var rawDataArray = [ 
          'https://example.com/image9',
          'https://example.com/image10',
          'https://example.com/image11'],
    len = rawDataArray.length;

    var $image = $('#intro').find('#Asset-15');

    for (i=0; i<len; ++i) {
      (function(index) {
        var s = rawDataArray[index];  

        //send to img shell the first raw data-src
        //which *automatically* generates src for img via Cloudinary responsive 
        $image.attr('data-src', s);

        //fire off a request to Cl. server to get the correct SRC
        //(asynchronous by default)
        $.cloudinary.responsive($image);

        var stBgAsset{a dynamic variable-injected by my backend on each loop occurence"} == new Image();
        stBgAsset{a dynamic variable-injected by my backend on each loop occurence"}.src = $image.attr('src');
       //if we take as assumption one of the  dynamic variable  
       //injected by my  backend on each loop occurence" is 15
       stBgAsset15.src = $image.attr('src');
      })(i);       
    };

 //if we take as assumption one of the  dynamic variable-injected by     
 //my  backend on each loop occurence" is 15
    console.log('stBgAsset15 value: '+stBgAsset15);
    console.log('stBgAsset15.src value: '+stBgAsset15.src);

    afterClickOnStThrobber();
  };

function afterClickOnStThrobber() {
  console.log('stBgAsset15 value: '+stBgAsset15);
  console.log('stBgAsset15.src value: '+stBgAsset15.src);
}
所以我真的需要它们有一个明确的名称,当它们从循环中输出时,我可以调用它。在一个数组中,值都在数组中,但要知道哪个值是哪个值太复杂了。我需要他们有一个名字,一个变量或其他可以调用的东西

编辑 我需要添加一个重要的信息后,这个答案 “只需在for循环外部定义stBgAsset15。此变量仍然不是全局变量,因为它的作用域位于PreloadFirstPriorityStatAssets函数内部。然后,您需要将stBgAsset15作为参数传递给afterClickOnStThrobber。”


问题是我不能这样做,因为我添加了somùe细节:src在循环中设置,因为它针对DataArray的每个值都会发生变化。在这个特性中,我注入了一个dat src,然后对每个数据src进行云计算分析,并生成一个不同的src。所以我不能把它移到圈外。它需要由循环处理。

只需在for循环外部定义
stBgAsset15
。此变量仍然不是全局变量,因为它的作用域在
preload firstprioritystatssets
函数中。然后,您需要将
stBgAsset15
作为参数传递给
,单击sthrobber
后,您可以将资产存储在数组中,并将该数组传递给其他函数:

preload firstprioritystatssets();
函数preload firstprioritystatssets(){
//变数
var i,
s
var rawDataArray=[
'https://example.com/image9' ],
len=rawDataArray.length;
var$image=$(“#简介”).find(“#资产-15”);
var bgAssets=[];//为图像创建数组

对于(i=0;i您需要在循环开始之前将
stBgAsset
创建为空对象:

var stBgAsset = {};
然后,在循环内部,您需要使用如下代码启动其元素:

stBgAsset["stBgAsset15"] = {}; //Your value
通过这种方式,您将拥有所需的名称,并且可以在服务器端找到它们。您还可以在for之后找到任何此类成员,因此在循环之外


在你抱怨
JSON.stringify
-ing,将东西发送到服务器并解析它们之前,会太慢,我恳请你尝试一下,我敢打赌你会对结果感到惊讶。如果不是,而且确实很慢,那么我想知道哪一行慢,有多慢,以及数据的大小你正在解析和发送。

这可能是重复的,没有意义。如果循环中声明了
var stBgAsset15
,你可能有多个图像,或者如果
len
0
,甚至没有图像。如果你想从循环外部访问它,你想要哪一个?问题是我不能,因为我添加了一些细节:src设置在循环中,因为它随DataArray的每个值而变化,所以你想循环它,但也要像没有循环一样使用它。@Bergi是正确的,你的要求毫无意义。我的建议。深呼吸,好好想想你真正想要什么,因为我觉得你在这里感到非常困惑。@Liam我知道这是正确的不清楚,但这就是我想要做的:我编辑了我的代码:stSrc没有设置为15。它将是由我的(ruby on rails)发送的多个值后端。因此,在每次循环发生/循环时,它都会设置不同的值:对于exmaple,我将以stSrc17、stSrc78、stSrc105结束,然后我只想知道如何在循环之外访问它们。很抱歉,首先不清楚,只是我无法在这个javascript问题中添加后端/ruby内容,所以我把话说得过于简单了只有一个stSrc值。“我的后端在每次循环发生时注入一个动态变量”也没有任何意义。您仍然有一个循环,只有一个循环。您不能为每个循环迭代动态注入不同的值,因为迭代发生在客户端上。我建议您实际将所有数据作为JSON对象或数组注入,然后使用该数据结构(在循环内部和外部,通过名称或索引访问单个元素)。我只是编辑了我的问题。我没有放一段代码,试图简化问题,但事实上我确实在回避一个重要信息:我不能将它放在循环外部(据我所知)谢谢。顺便说一句,我刚刚添加了一些信息并编辑了代码。我不想使用数组,因为之后我需要能够明确地调用每个值。例如,我需要调用stBgAsset15,然后调用stBgAsset14或stBgAsset18(这将取决于为不仅仅是stBgAsset15创建的值)。所以在数组中,我不能像这样访问它们。我真的需要它们有一个名称,当它们从循环中输出时,我可以调用。我理解。你可以创建一个带有键和值的对象,然后迭代这个对象。比如:让assets={stBgAsset
stBgAsset["stBgAsset15"] = {}; //Your value