如何在JavaScript匿名函数中访问变量

时间:2018-10-28 19:05:10

标签: javascript

如何访问变量C?

test = function(){
    a = 1;
    b = 2;
    c = a+b;
    return c
}
console.log(c)

返回:

Uncaught ReferenceError: c is not defined

编辑:请忽略上述问题

对此进行详细说明。我是JavaScript的新手,被困在无法工作的代码块上。我试图简化我遇到的问题,但我认为这可能适得其反...

这是我遇到的完整代码。我需要访问getAPIData.onload内部的变量,但是却变得“未定义” 访问这些值的最佳方法是什么?

getData();

function getData(){
  var activeMachines = [41, 44, 45]
  var dict = {};
  let data = activeMachines.reduce((obj, machineID) => {
    var getAPIData = new XMLHttpRequest();
    var url = 'http://127.0.0.1:8000/processes/apidata/' + machineID + '/';
    getAPIData.open('GET', url);
    getAPIData.send();
    getAPIData.onload = function(){
      var APIData = JSON.parse(getAPIData.responseText);
      dict['temp' + machineID] = APIData[0].tempData;
      dict['humid' + machineID] = APIData[0].humidData;
      timeValue = String((APIData[0].dateTime));
      dict['time' + machineID] = new Date(timeValue);
    }
    temp = dict['temp'+ machineID];
    humidity = dict['humid'+ machineID];
    time = dict['time'+ machineID];
    obj['machine_'+ machineID] = {temp, humidity, time}
    return obj
  }, {})
  console.log(data);
}

这将返回数据字典,但所有值均未定义。 任何帮助表示赞赏。 正如其他人所建议的,我将深入了解JavaScript范围。

2 个答案:

答案 0 :(得分:1)

c是一个全局变量,它是通过调用分配给全局变量test的匿名函数创建的。但是,您永远不会调用分配给test的匿名函数,因此永远不会创建变量。

因此,显而易见的解决方案是只调用分配给test的匿名函数:

test();

console.log(c);
// 3

但是,这是一个非常糟糕的主意。全局变量是邪恶的,邪恶的,邪恶的。它们将程序的各个部分捆绑在一起,形成一个混乱的混乱局面:由于可以从任何地方访问它们,因此您必须假定可以从任何地方访问它们。并且在一处更改它们可能会更改代码中完全不同部分中某些完全不相关的代码的行为。

实际上,情况甚至更糟:由于它们是 global ,因此在一处更改它们可能不仅会改变您的中完全不相关的代码的行为代码,它甚至可能会改变别人的代码中完全独立的部分中某些完全不相关的代码的行为!

避免这种情况的唯一方法是为每个全局变量创建唯一的名称,否则它们将发生冲突。实际上,您将需要为曾经写过,将要写的所有全局变量创造一个唯一的名称,并且该变量将永远被宇宙中的每个程序员所写!

但是实际上,这里根本不需要全局变量,因为您实际上在匿名函数中返回了c的值。您可以将这些变量设置为函数的局部变量,而只需使用返回值即可。实际上,您甚至根本不需要变量,因为您永远不会“改变”它们,因此可以使它们成为常量。

注意:在现代ECMAScript中,您应该始终总是偏爱const(除非您有充分理由使用let)和从不使用var或更糟糕的(如您在此处所做的)隐式全局变量定义。因此,在现代ECMAScript中,您的代码应如下所示:

const test = function () {
    const a = 1, 
        b = 2, 
        c = a + b;
    return c;
}

console.log(test());

此外,由于您没有给函数命名,也不依赖于this的动态作用域,因此可以使用箭头函数文字语法:

const test = () => {
    const a = 1, 
        b = 2, 
        c = a + b;
    return c;
}

console.log(test());

或只是给您的函数起一个名字:

function test() {
    const a = 1, 
        b = 2, 
        c = a + b;
    return c;
}

console.log(test());

答案 1 :(得分:0)

变量AB和C在函数中本地使用,但是它返回C的值,只需调用函数即可返回值,如它所说-charlietfl console.log(test()),您可以这样调用或:

 var c = test ();
    alert(c) or console.log (c);

现在您可以在函数外部使用名称varibale“ c”。