在函数#2中调用函数#1的变量

时间:2016-08-02 13:45:11

标签: javascript jquery function closures

我的代码在 mycode.js

<script type="text/javascript" src="mycode.js"></script>

我使用主HTML中的代码

(function ($) {
    var g_var = 10;
    console.log("func2: " + g_var);
    function2();
}
g_var

但{{1}}在function2

中不可见
  

未捕获的ReferenceError:未定义function2
  未捕获的ReferenceError:未定义g_var

我该如何纠正?

3 个答案:

答案 0 :(得分:0)

您应该阅读有关声明范围的内容。几乎每种编程语言都会发现varibale和函数作用域的这种行为。

<强>答案:

要解决您的问题,您必须在function2之外创建IIFE,否则它只能在内部使用。然后使用参数传递值。

function function2(g_var) {
    console.log("main func: " + g_var);
}

(function() {
    var g_var = 10;
    function2(g_var);
})();

<强>增加:

如果在与函数相同的范围内创建变量g_var,您也可以在function2的内部访问它。但在大多数情况下,我不会这样做。

在某些情况下这是有道理的,比如在使用其他函数内部创建的回调时。但在大多数情况下,您应该使用第一个示例并使用参数!

(function() {
    var g_var = 10;

    function function2() {
        console.log("main func: " + g_var);
    }

    function2();
})();

但实际上,在大多数情况下,这根本不是一个好主意!当你想到这样的事情时,它是有道理的:

$(".foo").each(function() {
    var that = this;

    $(".bar").click(function() {
        // access 'that'
    });
});

答案 1 :(得分:0)

您正在使用闭包,但未能返回公共方法。请参阅此示例并查看文档MDN: JS Closures

var foo = (function($) {
    function f2(g_var) { // private
        console.log("main func: " + g_var);
    }
    return {
        function2: function(g_var) {
            f2(g_var);
        }
  };   
})(jQuery);

你可以像这样调用它:

foo.function2(g_var);

答案 2 :(得分:-1)

首先,eisbehr是你需要从IIFE中定义你的函数然后yoi应该在所有东西之外定义你的变量。然后你可以在每个函数和片段中使用该js文件中的变量。

您应该像这样编写代码。

</VirtualHost>