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

尝试使用多个函数时无法使用全局变量-JavaScript-初学者,javascript,functional-programming,global-variables,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

作为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>

/*全局变量示例!不作为一个名为onClick的函数工作*/
函数make_name_variable(){var y_name=document.getElementById('y_name').value;}
函数make_date_variable(){var y_date=document.getElementById('y_date').value;}
函数make_month_variable(){var y_month=document.getElementById('y_month').value;}
函数make_year_variable(){var y_year=document.getElementById('y_year').value;}
功能测试(){
/*var y_name=document.getElementById('y_name').value;
var y_date=document.getElementById('y_date')。值;
var y_month=document.getElementById('y_month')。值;
变量y_year=document.getElementById('y_year')。值*/
document.getElementById('Result').innerHTML=y_date+y_month+y_year;
返回true;
}
函数计算(){
使_name_变量();
使_date_变量();
使_month_变为变量();
使_year_变量();
test();
}
用作:

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

无法获得预期的结果。我想在整个页面中使用这些数据,所以我想让所有函数都可以使用这些数据。我也无法以传统的方式将其设置为全球性的。在函数中声明变量会得到所需的结果。 因为你必须意识到我是一个彻头彻尾的傻瓜,所以如果有其他方法来完成事情,请告诉我。不知怎的,我觉得一定有更好更简单的方法来解决这个问题

提前感谢。:)


附言:第一个问题。请原谅我的错误。

关键字
var
在当前范围内声明了一个变量。如果在函数中声明一个
var
,它将只存在于函数中。在Javascript中声明全局变量的好方法是
window.globalVariableName
而不是
var globalVariableName或者,如果您未在浏览器中运行应用程序,请使用特定于该环境的全局对象替换窗口

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

声明全局变量的一种糟糕方法是

globalVariableName = 'Foo';
因为它不是一个明显的声明,看起来很像是忘记了var

最后,使用全局变量不是一件好事。所以,仔细使用它们。尝试检查它们是否已经被其他脚本使用,比如说

if(window.globalVariableName === undefined) window.globalVariableName = 'Bar';
试着读《圣经》的第一章 JavaScript模式 斯托扬·斯特凡诺夫 更多的解释

更新:awsering Andreas Rossberg

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

关于糟糕的样式,我可以同意,但只能部分同意,因为如果不将单变量模式用于这样的变量声明

(function(){ 
    var someVar1 = '', 
        someVar2 = null, 
        someVar3 = undefined; 
})();
你的代码看起来也一样糟糕

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

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

取消注释“严格使用”;将在第一个日志中给出未定义的,但在第二个日志中仍然是窗口。

一个简短的提示:如果您愿意学习Javascript,请正确操作,不要乱动全局变量和其他讨厌的东西。寻找一些教你如何正确使用JS的不错的教程。实际上,这是一种声明全局变量的糟糕方法,首先也是最重要的,因为它实际上并没有声明它。在全局范围中使用
var
。如果不需要,请不要使用
window
。那么您的意思是,我无法在函数中创建(如果您不喜欢术语declare)全局变量?因此,如果我将所有脚本封装到一个自调用函数中,我应该怎么做?示例:
(函数(){var globalVariable;})()显然不起作用。我还想请您解释这两个示例之间的区别:
console.log(window.globalVariable);window.globalVariable='Foo';console.log(window.globalVariable)
console.log(window.globalVariable);变量globalVariable='Foo';console.log(window.globalVariable)在你这么做之前,我相信你的评论没有证据证明你可以按照你描述的方式在本地创建一个全局名称——但这是一种糟糕的风格,仅此而已。它使你的程序更难阅读。FWIW,EcmaScript的下一个版本将不鼓励这种风格,支持适当的词汇范围。