尝试使用多个函数时无法使用全局变量 - JavaScript - 初学者

时间:2012-05-29 07:40:08

标签: javascript functional-programming global-variables

作为JavaScript初学者,我在尝试使用多个函数时无法使用全局变量。代码如下 -

<script type="text/javascript">

        /* Global Variable example! Not working as one function called onClick. */

        function make_name_variable () { var y_name = document.getElementById('y_name').value; }
        function make_date_variable () { var y_date = document.getElementById('y_date').value; }
        function make_month_variable () { var y_month = document.getElementById('y_month').value; }
        function make_year_variable () { var y_year = document.getElementById('y_year').value; }


        function test(){
                    /*var y_name = document.getElementById('y_name').value;
                    var y_date = document.getElementById('y_date').value;
                    var y_month = document.getElementById('y_month').value;
                    var y_year = document.getElementById('y_year').value;*/

                    document.getElementById('Result').innerHTML = y_date + y_month +  y_year;


                    return true;
            }

        function compute () {

            make_name_variable ();
            make_date_variable ();
            make_month_variable ();
            make_year_variable ();
            test(); 
           }
    </script>

使用as: -

<input type="submit" value="Submit" onclick="compute ()">

无法按预期获得结果。我希望在整个页面中使用数据,因此希望将其保持为全局所有要使用的函数。我也无法以传统方式将其设置为全局。在函数内声明变量可以得到所需的结果。 因为你必须意识到我是一个完整的菜鸟,所以如果有其他方法可以完成任务,请启发我。不知何故,我觉得必须有一种更好,更简单的方法来解决这个问题。

提前致谢。 :)

P.S:第一个问题在这里。请原谅我的错误。

2 个答案:

答案 0 :(得分:1)

var关键字声明当前范围内的变量。如果在函数内声明var,它将只存在于那里。 The MDN docs通常非常好。

答案 1 :(得分:-2)

在Javascript中声明全局变量的好方法是window.globalVariableName而不是var globalVariableName;或者如果您没有在浏览器替换窗口中运行您的应用程序,该窗口具有特定于该环境的全局对象。

无论您处于全局范围或函数中,第一个声明都将起作用。

声明全局变量的BAD方法是

globalVariableName = 'Foo';

因为它不是一个明显的声明,看起来很像忘记var。

最后globalVariables不是一件好事。所以要仔细地使用它们。尝试检查它们是否已被其他脚本使用,如此

if(window.globalVariableName === undefined) window.globalVariableName = 'Bar';

尝试阅读第一章 JavaScript模式 斯托扬斯特凡诺夫 有关更多解释。

更新:安德烈亚斯·罗斯伯格(Andreas Rossberg)

例如,“权威Javascript指南”中的David Flanigan在4.6.1中说明什么是全局变量,它们是全局对象的属性。您也可以在MDN上确认这一点。

关于不好的风格,我可以同意但只是部分,因为如果你不使用 Single var Pattern 来进行这样的变量声明

(function(){ 
    var someVar1 = '', 
        someVar2 = null, 
        someVar3 = undefined; 
})();

你的代码看起来一样糟糕。

至于下一版本的EcmaScript,你的参考资料有点过于简短。我只读过this将在严格的Javascript中以不同的方式处理。如果我理解正确,那么这个例子就是你所指的

function someFunction() 
{
    //'use strict';
    console.log(this); //Window or undefined
    console.log(window);// Window or Window
}
someFunction();

取消注释'use strict';将在第一个日志中为此提供未定义,但仍为第二个日志的窗口。