JavaScript - 声明嵌套函数的全局范围?

时间:2011-03-04 19:56:24

标签: javascript function scope

我尝试将全局范围赋予嵌套JavaScript函数不起作用:

//DECLARE FUNCTION B IN GLOBAL SCOPE
function B;

function A() {

    //DEFINE FUNCTION B INSIDE NEST
    B() {
        alert("function B is running");
    }
}

//CALL FUNCTION B FROM GLOBAL SCOPE
B();

这只是好奇心 - 你是对的,我没有任何理由想要这样做。

TIA - 我没有SO帐户来回复你的答案......

5 个答案:

答案 0 :(得分:15)

function B;只会产生语法错误。

您可以使用function expression。由于函数是第一类对象,因此可以将函数赋值给变量:

var B; // declare (global) variable (outer scope)

function A() {
    // assign a function to it
    B = function() {
        alert("function B is running");
    };
}

// we have to call A otherwise it won't work anyway
A();
// call B
B();

你也可以让A返回一个函数:

function A() {
    return function() {
        alert("function B is running");
    };
}

B = A();

这会使AB之间的关系更加清晰。

当然,您可以通过省略var来定义全局变量,但是您应该非常谨慎地使用它。使用尽可能少的全局变量。

function A() {
    B = function() {
        alert("function B is running");
    };
}

我敢打赌,有一种更好的方法,取决于你的实际目标。


More about Functions and function scope.

答案 1 :(得分:3)

怎么样:

function A() {
    window.B = function() {
        alert("function B is running");
    }
}
//CALL FUNCTION B FROM GLOBAL SCOPE
B();

答案 2 :(得分:2)

您可以这样做:

function outer() {
  function inner() {
    // ..
  }

  window['inner'] = inner;
}

直接引用“window”有点蠢,所以你可以这样做(从全局环境中):

(function (global) {
  function inner() {
    // code code code ...
  }

  global['inner'] = inner;
})(this);

答案 3 :(得分:0)

您的代码似乎存在一些问题

  1. 第一行似乎不是合法的Javascript(JSLint同意)。要声明未初始化的变量,请使用var B;语法
  2. 代码从不调用A来初始化B,因此调用B()调用未初始化的变量
  3. 我很确定在A中初始化B的代码也不合法。
  4. 尝试以下

    var B; // Establish B as a global scope variable
    
    function A() {
      B = function() {
        alert('B is running');
      };
    }
    
    A(); // Call the function which will cause B to be initialized
    B(); // Run B
    

答案 4 :(得分:0)

你很接近,但不完全正确。

  1. 您必须将B定义为变量,然后为其指定一个函数。
  2. 在执行B之前运行A(),否则B将是未定义的。最简单的运行方式是我在代码示例中显示的方式。
  3. 这些是代码中最小的更改次数,使其按您的要求运行:

    var B;
    
    (function A() {
        // define function B
        B = function() {
            alert("function B is running");
        }
    })();
    
    // call function B globally
    B();