如何在函数中设置全局变量

时间:2011-04-05 18:33:01

标签: javascript jquery

如何在函数中设置全局变量?

$(document).ready(function() {
    var option = '';

    $("[name=select_option_selected]").change(function() { 
        var option = $(this).val();
        alert(option); // Example: Foo  
    });

    alert(option); // Need it to alert Foo from the above change function    
});

8 个答案:

答案 0 :(得分:25)

在jQuery onready

的范围之外声明它
var option = '';

$(document).ready(function() {
    $("[name=select_option_selected]").change(function() { 
        option = $(this).val();
        alert(option); // Example: Foo  
    });

    alert(option); //This will never be "Foo" since option isn't set until that select list changes
});

如果要将其初始化为当前选定值,请尝试:

var option = "";
var $select_option_selected = null;

$(function() {        
    $select_option_selected = $("[name='select_option_selected']")
    $select_option_selected.change(function() { 
        option = $(this).val();
    });    
    option = $select_option_selected.val();
});

答案 1 :(得分:6)

糟糕的方式

正如其他答案所指出的,创建全局变量不是一个好主意。正如他们所指出的,您可以通过以下方式创建一个全局变量:

  • 在所有函数之外声明变量
  • 在没有var关键字
  • 的情况下初始化变量
  • 或者,将其声明为窗口对象的属性:window.options = 'blah';

使用jQuery的Data()方法

但是有一种更好的方法可以使用jQuery(和其他库)创建一个全局可访问的值。在jQuery中,使用data()方法存储与DOM元素关联的值:

// store 'blah' at document root
$(document).data('mysite.option', 'blah');

// retrieve value
alert($(document).data('mysite.option'));

注意"mysite" ...为数据库命名空间是个好主意,原因与在javascript中命名全局变量一样好。

答案 2 :(得分:4)

$(document).ready(function() {
    var option = '';

    $("[name=select_option_selected]").change(function() { 
        option = $(this).val(); //no declaration of new variable, JavaScript goes to what encloses the function
        alert(option); // Example: Foo  
    });

    alert(option); // Need it to alert Foo from the above change function    
});

答案 3 :(得分:3)

你确定要吗?通常要避免全局变量。在浏览器中,window是全局对象,因此如果您执行window.option = ...,则option将在全球范围内可用。

我强烈建议命名一个比“option”更独特的全局变量,以避免破坏现有的东西。

另一个选项,我也不建议:请离开var

myvariable = 'foo';

如果myvariable之前从未进行过delcared,它将被声明为窗口上的属性,使其成为全局变量。然而,这通常被认为是(非常)不好的做法。

答案 4 :(得分:3)

您可以使用window.前缀从函数范围内访问全局变量

window.option = ...;

答案 5 :(得分:3)

其他人未提及的两种方法,适用于以下情况:1。无权访问全球 LexicalEnvironment, 10.2.3 < / sup>和2.正在尝试编写您希望支持系统的代码,其中直接引用全局对象 15.1 (例如{{1 HTML DOM中的节点,或者节点 [1] 中的window不保证:

  1. 通过将其包装在多余的PrimaryExpression中,对GLOBAL进行间接 15.1.2.1.1 调用,因此:eval(数字和逗号运算符无意义)......然后调用其结果。这会强制代码在全局执行上下文中运行。 10.4.2

    然后我们可以在全局词汇环境中声明 10.5 一个新变量,如上所述;或者,就此而言,在该环境中做任何我们想要的事情:

    (1,eval)(...)
  2. 为了减少四舍五入(以及启动,避免FUD - function global_define(ident, value){ (1,eval) ("var "+ident+"; (function(v){ "+ident+" = v })") (value) } 调用),我们可以直接访问全局对象并设置属性< / strong> 4.2 ,它将作为我们代码中其他地方的全局变量提供。 [2] < / p>

    不是采用上面的eval方法并通过我们在全局上下文中编写的代码获得对全局对象的访问,而是发现我们可以作为eval值<访问全局对象在使用this调用的任何函数中的sup> 10.4.3

    null
  3. <强>呼

    好的,对于那些没有从规范链接和var global = (function(){ return this }).call(null) global[ident] = value 电话中晕倒的人来说,还有更多的阅读:

    1. @kangax涵盖所有基地quite thoroughly。说真的,请阅读如果您有任何问题我在这里没有回答(包括那些与最重要的特性浏览器支持有关的问题!)
    2. 显然,ECMAScript 5规范本身的相关部分,可以了解预期在理想世界中的工作方式。不,真的;我知道规格是一个可怕的想法,但ES(“JavaScript”)规范是我见过的最容易阅读和最易理解的规范之一。他们真的很棒。立即注意,并没有特别的顺序,


    3. [1]:其他答案中的讨论,建议Node.js和其他CommonJS兼容系统中的eval以某种方式与全局对象相关,这个问题是误导的。在系统设计方面,人们可能更适合使用他们的环境模块工具,而不是在全局对象上徘徊......但这是对另一个Stack Overflow帖子的讨论。 (=

      [2]:对于那些在规范中跟随的人,很难证明全局对象的属性成员可以作为Identifier dereferences访问。从 10.2.1.2 Object Environment Records 10.2.3 The Global Environment开始,了解全局对象如何链接到环境,然后跳转到按此顺序 18.12.3,18.12.2, 18.12.1 collectively describing [[Get]] on the global object

      Nota bene :在此详细说明中,我没有建议做其中任何一件事是好主意。或者,就此而言,与全局范围进行交互根本就是一个好主意。与手头的问题无关,但是为了抚慰自己的良心,我补充一点,我将所有自己的代码包装在文件顶部的IIFE开头;这一点,以及exports关键字的宗教应用,确保我永远不会与JavaScript处理全局对象的所有进行交互。一个巨大的混乱,避免。你应该这样做。我是这么说的。我很聪明。 (;

答案 6 :(得分:1)

只声明一个全局对象

var obj={};
function my_function()
{
 obj['newVariable'] = 'someValue';
}

通过这种方式我实现了全局变量。

答案 7 :(得分:1)

http://jsfiddle.net/Kba5u/

var foo = 'bar';

function changeFooToBaz(){
   foo = 'baz';
}

// changeFooToBaz();
console.log(foo); #=> 'bar'

现在,取消注释changeFooToBaz的调用:

var foo = 'bar';

function changeFooToBaz(){
   foo = 'baz';
}

changeFooToBaz();
console.log(foo); #=> 'baz'

changeFooToBaz确实改变了foo的内容,这是一个在比函数更高的范围内声明的变量。