Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.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_Jquery - Fatal编程技术网

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

Javascript 如何在函数中设置全局变量,javascript,jquery,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

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

$(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    
});

在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();
});

你确定你想去吗?通常应避免使用全局变量。在浏览器中,
window
是全局对象,因此如果执行
window.option=…
,则
option
将全局可用

我强烈建议将全局变量命名为比“option”更独特的名称,以避免对现有内容的冲击

另一个选项,我也不推荐:去掉
var

myvariable = 'foo';

若myvariable以前从未被删除过,那个么它将被声明为window上的一个属性,使其成为全局的。这通常被认为是(非常)糟糕的做法。

您可以使用
窗口。
前缀从函数范围内访问全局变量

$(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    
});
window.option = ...;

坏方法

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

  • 在所有函数之外声明变量
  • 在不使用
    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中为全局变量命名名称相同。

其他人没有提到过的两种方法,适用于以下情况:1。无法访问全局词典环境,以及2。正在尝试编写代码,以支持无法保证直接引用全局对象(例如HTML DOM中的
窗口
,或节点[1]中的
全局
)的系统:

  • 求值
    进行间接调用,方法是将其包装在一个多余的主表达式中,因此:
    (1,求值)(…)
    (数字和逗号运算符没有意义)…,然后调用其结果。这将强制代码在全局执行上下文中运行

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

    function global_define(ident, value){
       (1,eval) ("var "+ident+"; (function(v){ "+ident+" = v })") (value) }
    
  • 为了减少循环(为了引导,避免频繁的
    eval
    调用),我们可以直接访问全局对象并在其上设置一个属性,该属性将作为全局变量在代码中的其他地方提供。[2]

    不是采用上面的
    eval
    方法,而是通过我们在全局上下文中编写的代码访问全局对象,结果证明,我们可以在使用
    null
    调用的任何函数中以
    这个
    值的形式访问全局对象:

    var global = (function(){ return this }).call(null)
    global[ident] = value
    
  • Phew.

    好的,更多的阅读,对于那些还没有因为规范链接和
    eval
    调用而晕倒的人来说:

  • 覆盖所有的基础。说真的,如果你有任何我没有回答的问题(包括那些与浏览器支持的所有重要特性相关的问题!)
  • 显然,ECMAScript 5规范本身的相关章节,旨在了解在理想世界中如何工作。不,确实如此;我知道规范是一个可怕的想法,但是ES(“JavaScript”)规范是我见过的最容易阅读和理解的规范之一。他们真的很棒。立即注意到,并且没有特定顺序

    • 10.4:具体介绍如何处理“全局代码”和“评估代码”
    • 10.2:这些描述了“变量存储的位置”。(感兴趣的“全球环境”就是其中之一。)
    • 10.1:介绍什么是“全局代码”和“程序”
    • 15.1:不幸的是,与其标题相比,它的相关性要小得多。还是值得一试

  • [1] :其他答案中的讨论表明Node.js和其他符合CommonJS的系统中的
    导出
    ,在某种程度上与全局对象相关,这是一种误导。在系统设计方面,使用环境中的模块工具可能比使用全局对象更合适……但这是另一篇关于堆栈溢出的文章的讨论。(=

    [2]:对于那些遵循规范的人来说,更难证明全局对象的属性成员可以作为标识符解除引用进行访问。从10.2.1.210.2.3开始,了解全局对象如何链接到环境,然后跳到18.12.3、18.12.2、and18.12.1按顺序排列


    非但没有好处:在这篇文章中,我从来没有提出过做这两件事中的任何一件都是好主意。或者,就这一点而言,与全球范围的互动是一个好主意。与手头的问题无关,但为了安抚我自己的良心,我补充说,我将自己的所有代码都包装在一个开始的im中中间位于文件顶部;这与
    var
    关键字的宗教应用一起,确保我根本不会与JavaScript对全局对象的处理进行交互。避免了一团混乱。你应该这样做。我说过了。我很聪明。(;

    只需声明一个全局对象

    var obj={};
    function my_function()
    {
     obj['newVariable'] = 'someValue';
    }
    
    这样我就实现了全局变量。

    现在,,
    var foo = 'bar';
    
    function changeFooToBaz(){
       foo = 'baz';
    }
    
    // changeFooToBaz();
    console.log(foo); #=> 'bar'
    
    var foo = 'bar';
    
    function changeFooToBaz(){
       foo = 'baz';
    }
    
    changeFooToBaz();
    console.log(foo); #=> 'baz'