【问题标题】:Access a variable inside a function which is inside a function in javascript?访问javascript函数内部的函数内部的变量?
【发布时间】:2017-02-02 09:39:49
【问题描述】:

如何访问 javascript 函数内部的函数内部的变量?

var a;
var surveyObjects = Parse.Object.extend(surveyObject);
var query= new Parse.Query(surveyObjects);
query.count({
    success: function(count){a = count;},
    error: function(error){}
});
alert("count of function "+a);

a 显示undefined 值。我需要在外面使用a的值。

【问题讨论】:

  • 你不能,除非你修改代码。
  • 你的代码是荒谬的。
  • 在外部范围/全局范围内声明变量

标签: javascript function variables return return-value


【解决方案1】:

由于 javascript 和大多数语言的作用域变量,您无法从函数外部访问在函数内部声明的变量。变量只属于函数的作用域,不属于全局作用域。

幸运的是,函数继承了调用者的作用域。因此,让您的变量可以从函数外部访问的最简单方法是首先在函数外部声明,然后在函数内部使用它。

function one(){
   var a;

   function two(){
       a = 10;
       return a;
   }

   return a;
}

请注意,您应该非常小心如何确定变量的范围。函数的全部意义在于封装和隔离功能。

在promise的情况下,你可以在promise之外声明一个变量,然后在成功时设置它的值。

var a;

Parse.doSomething().then(function(data) {
    a = data;
});

编辑:根据您在 cmets 中显示的内容,您遇到了异步问题。 Promise 是异步的,这意味着它们不会在您的代码中按顺序运行。这就是存在successerror 回调的原因,一旦promise 解决就会被调用。您的 alert(a) 在承诺回调之外,因此它会立即运行,无需等待 Parse 承诺解决,因此 a 仍然未定义。如果你将alert(a) 放在promise 回调中,a 将在此时设置。

var a;
query.count({
    success: function(count) {
        a = count;
        alert(a);
        return a;
    },
    error: function(err) {}
});

【讨论】:

  • 谢谢大家。但问题是我正在使用解析和使用承诺,所以它将是函数一 (){ query.count({ success: function(count) {c =count;}, 错误:function(error){} }); } 警报(c);我需要在这里获取 c 的值。
  • 您应该在问题中明确表示您正在使用 Parse。您可以按照我的回答中描述的相同方式访问承诺处理程序函数中的变量。此外,Parse 服务已被弃用,并在几个月后关闭。
  • 是的,我们使用解析开源服务器。那么有什么方法可以从成功函数之外获取值?
  • 我已经更新了我的答案,包括一个在承诺之外设置变量的人为示例。你应该用一个更接近你实际问题的例子来更新你的问题。
  • 但它仍然显示 undefined 。变量一个; query.count({ success:function(count){ a=count; return a;},error: function(err){} });警报(a);
【解决方案2】:

您可以通过使用隐式全局变量行为来做到这一点。

function one(){
   function two(){
      a=10;
   }
  
  two();
}

one();
console.log(a);

如果你没有在 javascript I.E 中声明一个变量而不使用 var 关键字,它就会变成一个全局变量。

进一步阅读:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/var#Implicit_globals_and_outer_function_scope

【讨论】:

  • 这实际上与吊装无关。提升机制仅确保首先处理您的声明,因此如果您在应用程序的第 10 行有var a,您将能够在第 4 行使用它而无需获得ReferenceError。但是,提升不会使变量移动范围。
【解决方案3】:
//  You can simply do it by 
function test()
{
    this.name='xyz';
}
var obj = new test();

console.log(obj.name);

【讨论】:

    【解决方案4】:

    喜欢它:

    function one() {
        this.two = function () {
            var a = 10;
            return a;
        }
    }
    
    var o = new one();
    alert(o.two());
    

    【讨论】:

    • 谢谢大家。但问题是我正在使用解析和使用承诺,所以它是函数一 (){ query.count({ success: function(count) {c =count;}, 错误:function(error){} }); } 警报(c);我需要在这里获取 c 的值。
    【解决方案5】:

    使用 return 语句全局访问变量。

    function(){
    var k=1;//local
    return k;//global
    }
    result=k+10;//sample
    

    【讨论】:

      【解决方案6】:

      谢谢。 我将变量声明为全局变量并在内部函数中插入值,然后在函数内部进行函数调用以触发另一个调用该值的函数。

      var a=0;
      var surveyObjects = Parse.Object.extend(surveyObject);
      var query= new Parse.Query(surveyObjects);
      query.count({
          success: function(count) {a =count; total();},
          error:function(error){}
      });
      
      function total(){alert (a);}
      

      【讨论】:

        猜你喜欢
        • 2015-04-29
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多