如何在函数中设置全局变量?
$(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
});
答案 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
不保证:
通过将其包装在多余的PrimaryExpression中,对GLOBAL
进行间接 15.1.2.1.1 调用,因此:eval
(数字和逗号运算符无意义)......然后调用其结果。这会强制代码在全局执行上下文中运行。 10.4.2
然后我们可以在全局词汇环境中声明 10.5 一个新变量,如上所述;或者,就此而言,在该环境中做任何我们想要的事情:
(1,eval)(...)
为了减少四舍五入(以及启动,避免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
<强>呼强>
好的,对于那些没有从规范链接和var global = (function(){ return this }).call(null)
global[ident] = value
电话中晕倒的人来说,还有更多的阅读:
显然,ECMAScript 5规范本身的相关部分,可以了解预期在理想世界中的工作方式。不,真的;我知道规格是一个可怕的想法,但ES(“JavaScript”)规范是我见过的最容易阅读和最易理解的规范之一。他们真的很棒。立即注意,并没有特别的顺序,
[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)
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
的内容,这是一个在比函数更高的范围内声明的变量。