【问题标题】:How to keep object in scope?如何将对象保持在范围内?
【发布时间】:2015-12-14 19:47:36
【问题描述】:

我正在实现以下功能。大部分页面在我的 entryPage.php 文件中创建一次。 “Stage”表是通过对stageArea.phpAJAX 调用创建的。我的问题是我的数据对象是在$(document).ready(function() {...} 中创建的,$(document).ready(function() {...} 之外的其他函数无法访问该对象。

entryPage.php

...HTML...
<script> 
  $(document).ready(function() { 

    var dataObject = new DataEntryObj(); // create the data object

    $.post("../stageArea.php", {array : dataObject.dataArray}, function(data){
        $('#stageArea').html(data);
    });
  }
  var DataEntryObj = function(){
    this.dataArray = [[0,0,0,0,0,0,0,3,0]];
    ....
  }

  function updateData(value, row, index){
    alert("update:" + row + " " + index + " " + value); //values come in OK
    alert(dataObject.dataArray[row][index]); // but the data Object isn't here
    dataObject.dataArray[row][index] = value; // so this cannot be assigned

    $.post("../stageArea.php", {array : dataObject.dataArray}, function(data){
        $('#stageArea').html(data);
    });
  }
</script>   

将对象与其他函数保持在同一范围内的好的解决方案是什么?

【问题讨论】:

  • $(document).ready(function() {}) 缺少关闭 ) ?在.ready() 事件之前,updateData 在哪里调用?

标签: javascript jquery object scope


【解决方案1】:

只需在$(document).ready 之外声明var,然后在不使用var 的情况下为其赋值

var dataObject ;
$(document).ready(function() { 

    dataObject = new DataEntryObj(); // create the data object
    ......

});

现在相当于window.dataObject

【讨论】:

  • 这给了我以下控制台错误:Uncaught TypeError: DataEntryObj is not a function
  • 那么您可能已将DataEntryObj 函数声明包含在另一个函数中。在范围可用性方面,函数与变量相同
【解决方案2】:

你可以定义一个全局变量,但你应该确保 updateData 在 DOM 变得可访问后尝试访问 dataObject

var dataObject, DataEntryObj;

DataEntryObj = function(){
  this.dataArray = [[0,0,0,0,0,0,0,3,0]];
}

$(document).ready(function() {

  dataObject = new DataEntryObj();

  $.post("../stageArea.php", {array : dataObject.dataArray}, function(data){
    $('#stageArea').html(data);
  });

}

function updateData(value, row, index) {
   // will have ref to dataObject changed by $(document)
}

【讨论】:

    【解决方案3】:

    您不能访问 dataObject 变量。因为你设置了函数。您应该创建一个全局对象变量,并且可以在任何地方访问。

    var dataObject = { data: null };
    
    $(document).ready(function() { 
    
        dataObject.data = new DataEntryObj(); // create the data object
    
        $.post("../stageArea.php", {array : dataObject.data.dataArray}, function(data){
            $('#stageArea').html(data);
        });
      }
      var DataEntryObj = function(){
        this.dataArray = [[0,0,0,0,0,0,0,3,0]];
      }
    
      function updateData(value, row, index){
    
        alert("update:" + row + " " + index + " " + value);
        alert(dataObject.data.dataArray[row][index]);  
        dataObject.data.dataArray[row][index] = value;
    
        $.post("../stageArea.php", {array : dataObject.data.dataArray}, function(data){
             $('#stageArea').html(data);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多