Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript作用域的帮助_Javascript_Scope - Fatal编程技术网

Javascript作用域的帮助

Javascript作用域的帮助,javascript,scope,Javascript,Scope,此示例是我的代码的简化版本。我仍在努力掌握编写javascript的新方法(而不是10年前的方法),因此感谢您的耐心。我需要globalVal的价值才能被访问,我遇到了麻烦。该值是从作为另一个方法的参数调用的函数中获得的。这个例子可能更容易看到。只需要能够从DOM中的任何地方访问globalvar。这可能吗?谢谢 <html> <head> <script type="text/javascript"> var globalvar; func

此示例是我的代码的简化版本。我仍在努力掌握编写javascript的新方法(而不是10年前的方法),因此感谢您的耐心。我需要globalVal的价值才能被访问,我遇到了麻烦。该值是从作为另一个方法的参数调用的函数中获得的。这个例子可能更容易看到。只需要能够从DOM中的任何地方访问globalvar。这可能吗?谢谢

<html>
<head>
<script type="text/javascript">
    var globalvar;

    function initialize() { 
        var someVariable = 5;
        doSomething(someVariable, getTheVar);
    }

    function doSomething(someVariable, expectGlobalVar) {
        //alert(someVariable);
        alert(expectGlobalVar);
    }

    function getTheVar() {
        globalVar = "test"; 
        return globalVar;

    }
</script>
<title></title>
</head>
<body onload="initialize()">
    This is a test
</body>
</html>

球形变种;
函数初始化(){
变量var=5;
doSomething(someVariable,getTheVar);
}
函数doSomething(someVariable,expectGlobalVar){
//警报(某些变量);
警报(expectGlobalVar);
}
函数getTheVar(){
globalVar=“测试”;
回球;
}
这是一个测试

你做得对

任何在全局范围内声明的变量,就像您在示例中所做的一样,都可以从窗口中的每个范围中使用

(顺便说一句,声明全局变量[几乎]等同于
window.myVar=someValue;

示例中的问题是,您实际上并没有在第四行调用
getTheVar
,而只是传递函数本身。你可能想要这个:

doSomething(someVariable, getTheVar());

你做得对

任何在全局范围内声明的变量,就像您在示例中所做的一样,都可以从窗口中的每个范围中使用

(顺便说一句,声明全局变量[几乎]等同于
window.myVar=someValue;

示例中的问题是,您实际上并没有在第四行调用
getTheVar
,而只是传递函数本身。你可能想要这个:

doSomething(someVariable, getTheVar());

您应该调用函数
getTheVar
,而不是传递它:

function initialize() { 
        var someVariable = 5;
        doSomething(someVariable, getTheVar());
}

您应该调用函数
getTheVar
,而不是传递它:

function initialize() { 
        var someVariable = 5;
        doSomething(someVariable, getTheVar());
}

您基本上很好,您可以直接从页面中任何地方运行的任何脚本访问
globalVar
,如果您以现有的方式声明它的话

具体来说:使用
var x
窗口
对象上声明一个属性(它有一个特殊的特性,即它不能被删除,但这在这里并不重要)

因此:

var foo = 2;
alert(foo);        // alerts "2"
alert(window.foo); // also alerts "2"
window.bar = 4;
alert(window.bar); // alerts "4"
alert(bar);        // also alerts "4"
当然,这只适用于顶层,不适用于任何功能。在函数内部,您正在声明函数的局部内容。(从本质上说,这比这有趣多了。)

但既然您询问了范围,那么您定义的所有其他内容(
initialize
getTheVar
doSomething
)也都是全局性的也就毫无意义了。通常,您希望避免在全局命名空间中放置任何可以避免放置的内容

因此,我主张始终使用“范围函数”:

…并明确地导出您真正需要的全局内容(通过将它们指定给
窗口
上的属性)

在您的情况下,您已经说过您需要
globalVar
,并且还使用了
initialize
(尽管在
initialize
中还有其他方法可以执行),因此您可以这样做:

(function() {
    var globalvar;

    // Exports
    window.globalVar = globalVar;
    window.initialize = initialize;

    // Implementation

    function initialize() { 
        var someVariable = 5;
        doSomething(someVariable, getTheVar);
    }

    function doSomething(someVariable, expectGlobalVar) {
        //alert(someVariable);
        alert(expectGlobalVar);
    }

    function getTheVar() {
        globalVar = "test"; 
        return globalVar;
    }
})();
但你可以更进一步。由于在
body
元素的
load
事件之前,您不会调用
initialize
,因此可以避免发布
initialize
。只需将脚本标记放在文档末尾,就在关闭标记之前(如建议的那样),然后在那里进行初始化:

<html>
<head>
<title>...</title>
</head>
<body>This is a test
<script type='text/javascript'>
(function() {
    var globalvar;

    // Initialization
    initialize();

    // Exports
    window.globalVar = globalVar;

    // Implementation
    function initialize() { 
        var someVariable = 5;
        doSomething(someVariable, getTheVar);
    }

    function doSomething(someVariable, expectGlobalVar) {
        //alert(someVariable);
        alert(expectGlobalVar);
    }

    function getTheVar() {
        globalVar = "test"; 
        return globalVar;
    }
})();
</script>
</body>
</html>

...
这是一个测试
(功能(){
球形变种;
//初始化
初始化();
//出口
window.globalVar=globalVar;
//实施
函数初始化(){
变量var=5;
doSomething(someVariable,getTheVar);
}
函数doSomething(someVariable,expectGlobalVar){
//警报(某些变量);
警报(expectGlobalVar);
}
函数getTheVar(){
globalVar=“测试”;
回球;
}
})();
DOM就在这一点上


但是,如果我们愿意,我们可以更进一步:如果我们愿意,我们可以在全局名称空间中没有任何内容。如果在
initialize
函数中连接所有处理程序,而不是使用
onload
onclick
和类似属性,则除了代码之外,
globalVar
不需要是全局的。(你可以在事后使用
attachEvent
[在IE上]、
addEventListener
[在基于标准的浏览器上],或者更好的方法是使用诸如、、或之类的库来连接处理程序。)

你基本上很好,如果你按照自己的方式声明,你可以从页面任何地方运行的任何脚本直接访问
globalVar

具体来说:使用
var x
窗口
对象上声明一个属性(它有一个特殊的特性,即它不能被删除,但这在这里并不重要)

因此:

var foo = 2;
alert(foo);        // alerts "2"
alert(window.foo); // also alerts "2"
window.bar = 4;
alert(window.bar); // alerts "4"
alert(bar);        // also alerts "4"
当然,这只适用于顶层,不适用于任何功能。在函数内部,您正在声明函数的局部内容。(从本质上说,这比这有趣多了。)

但既然您询问了范围,那么您定义的所有其他内容(
initialize
getTheVar
doSomething
)也都是全局性的也就毫无意义了。通常,您希望避免在全局命名空间中放置任何可以避免放置的内容

因此,我主张始终使用“范围函数”:

…并明确地导出您真正需要的全局内容(通过将它们指定给
窗口
上的属性)

在您的情况下,您已经说过您需要
globalVar
,并且您还需要als