使用另一个作用域的函数访问当前执行上下文的变量

时间:2019-01-28 10:39:56

标签: javascript

我正在框架内开发一个小部件,因此我需要使用类似下面的模式来记录变量“ a”。如何“调用”此函数log_a,以便它可以访问在调用它的执行上下文中声明的变量?即让控制台输出“ a value”,而不是当前无法找到变量“ a”的错误。

(function(global) {

global.log_a = function() {
      console.log(a);
};

}(window));

var anotherFunction = function() {

    var a = 'a value';

    log_a();
};

anotherFunction();

编辑:

我试图简化示例以使问题更易于理解,但现在我看到它引起了混乱。更新后有更多说明:

  • 代码的第一部分试图模仿我将大型函数移动到另一个文件中以获得更简洁代码的工作。

  • 我正在使用一个库,其中一个输入是一个函数,它将始终向其传递一个参数,因此我没有选择添加额外参数的选择(即,建议将“ a”作为参数的答案)

  • 将“ a”声明为全局作品的诀窍是我目前正在使用的技巧,但我认为这不是最佳实践。

所以我的问题是(我猜答案是“不可能”),是否有某种方法可以调用log_a,使其行为类似于代码如下:

var anotherFunction = function() {

    var a = 'a value';

    var log_a = function() {
      console.log(a);
    };
};

anotherFunction();

3 个答案:

答案 0 :(得分:1)

变量indices_items = [] for l in items: indices_items.append(np.argwhere(l >= 0.7).flatten().tolist()) indices_items Out[5]: [[0], [1, 5, 6, 7], [2, 6, 7, 9], [3], [], [1, 5, 8], [1, 2, 6, 7, 9], [1, 2, 6, 7, 9], [5, 8], [2, 6, 7, 9]] 仅存在于函数a的范围内;

anotherFunction

您可以将变量(function(global) { global.log_a = function() { console.log(a); }; }(window)); var anotherFunction = function() { // var a exists only here, inside this function var a = 'a value'; // log_a is another function, it has its own scope, // and it doesn't know about var a log_a(); }; anotherFunction(); 作为a的参数传递给log_a中的log_a(a),也可以使变量anotherFunction可供两个{ {1}}和a函数:

anotherFunction

答案 1 :(得分:1)

您可以使用函数 arguments a的值传递给您的log_a方法。您当前正在发生的问题是var a = 'a value'未知log_a,因为它是在另一个函数中定义的。这是因为无法在函数范围之外访问在函数范围内用var声明的变量。因此,您最好执行以下操作:

(function(global) {
  global.log_a = function(a) { // retrieve 'a' as an argument in the log_a method
    console.log(a); // print the argument passed through
  };

}(window));

var anotherFunction = function() {
  var a = 'a value';
  log_a(a); // pass through 'a' into the `log_a` method
};

anotherFunction();

答案 2 :(得分:1)

您可以从该函数传递变量a 值,以便 log_a()函数可以访问该变量值。

    (function(global) {

        global.log_a = function(a){
              console.log(a);
        };

    }(window));

    var anotherFunction = function() {

        var a = 'a value';

        log_a(a);
    };

    anotherFunction();