[英]How can I set a Global Variable from within a function
如何在函數中設置全局變量?
$(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();
});
壞道路
正如其他答案所指出的那樣,創建全局變量並不是一個好主意 。 正如他們所指出的,您可以通過以下方式創建全局變量:
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中命名全局變量一樣好。
$(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
});
其他任何人都沒有提到的兩種方法,適用於以下情況:1。無法訪問全局 LexicalEnvironment, 10.2.3和2.正在嘗試編寫您希望支持直接引用全局對象的系統的代碼15.1 (例如HTML DOM中的window
或Node [1]中的 GLOBAL
)不保證:
通過將它包裝在多余的PrimaryExpression中,對eval
進行間接 15.1.2.1.1調用,因此: (1,eval)(...)
(數字和逗號運算符無意義)...然后調用其結果。 這會強制代碼在全局執行上下文中運行。 10.4.2
然后我們可以在全球詞匯環境中聲明10.5一個新變量,如上所述; 或者,就此而言,在該環境中做任何我們想要的事情:
function global_define(ident, value){ (1,eval) ("var "+ident+"; (function(v){ "+ident+" = v })") (value) }
為了減少四舍五入(以及啟動,避免FUD -ridden eval
調用),我們可以直接訪問全局對象並在其上設置屬性 4.2 ,然后它將作為代碼中其他地方的全局變量提供。 [2]
我們不是采用上面的eval
方法並通過我們在全局上下文中編寫的代碼獲得對全局對象的訪問,而是發現我們可以在使用null
調用的任何函數中訪問全局對象作為this
值10.4.3 :
var global = (function(){ return this }).call(null) global[ident] = value
唷。
好的,對於那些沒有從規范鏈接和eval
調用中暈倒的人來說,還有更多閱讀:
很明顯的是ECMAScript 5規范本身的相關章節,以獲取事情是如何打算在一個理想的世界里工作的想法。 不,真的; 我知道規格是一個可怕的想法,但ES(“JavaScript”)規范是我見過的最容易閱讀和最易理解的規范之一。 他們真的很棒。 值得注意的是,並沒有特別的順序,
[1]:在其他答案中的討論,表明Node.js和其他CommonJS兼容系統中的exports
在某種程度上與全局對象有關,這個問題要求誤導。 在系統設計方面,人們可能更適合使用他們的環境模塊工具,而不是在全局對象上徘徊......但這是對另一個Stack Overflow帖子的討論。 (=
[2]:對於那些跟隨規范的人來說,更難以證明全局對象的屬性成員可以作為Identifier dereferences訪問。 從10.2.1.2 對象環境記錄和10.2.3 全局環境開始 ,了解全局對象如何鏈接到環境,然后按順序跳到18.12.3,18.12.2和18.12.1 , 共同描述全局對象上的[[Get]] 。
Nota bene :在這個細節中,我沒有提出過做這些事情中的任何一個都是個好主意 。 或者,就此而言,與全球范圍相互作用是一個好主意。 與手頭的問題沒有任何關系,但是為了撫慰自己的良心,我補充一點,我將所有自己的代碼包裝在文件頂部的IIFE開頭; 這一點,與宗教應用程序一起var
關鍵字,確保我從來沒有與JavaScript的處理全局對象的所有交互。 一個巨大的混亂,避免。 你應該這樣做。 我是這么說的。 我很聰明。 (;
你確定你要? 通常要避免全局變量。 在瀏覽器中, window
是全局對象,因此如果你執行window.option = ...
,那么option
將全局可用。
我強烈建議命名一個比“選項”更獨特的全局變量,以避免破壞現有的東西。
另一種選擇,我也不建議:留下var
myvariable = 'foo';
如果myvariable之前從未進行過delcared,它將被聲明為窗口上的屬性,使其成為全局變量。 然而,這通常被認為是(非常)不好的做法。
你可以使用window.
用於從函數范圍內訪問全局變量的前綴
window.option = ...;
只是聲明一個全局對象
var obj={};
function my_function()
{
obj['newVariable'] = 'someValue';
}
通過這種方式,我實現了全局變量。
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
的內容, foo
是一個在比函數更高的范圍內聲明的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.