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'代码>
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
eval
调用而晕倒的人来说:
- 10.4:具体介绍如何处理“全局代码”和“评估代码”
- 10.2:这些描述了“变量存储的位置”。(感兴趣的“全球环境”就是其中之一。)
- 10.1:介绍什么是“全局代码”和“程序”
- 15.1:不幸的是,与其标题相比,它的相关性要小得多。还是值得一试
[1] :其他答案中的讨论表明Node.js和其他符合CommonJS的系统中的
导出
,在某种程度上与全局对象相关,这是一种误导。在系统设计方面,使用环境中的模块工具可能比使用全局对象更合适……但这是另一篇关于堆栈溢出的文章的讨论。(=
[2]:对于那些遵循规范的人来说,更难证明全局对象的属性成员可以作为标识符解除引用进行访问。从10.2.1.2和10.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'