簡體   English   中英

如何在函數中設置全局變量

[英]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 )不保證:

  1. 通過將它包裝在多余的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) } 
  2. 為了減少四舍五入(以及啟動,避免FUD -ridden eval調用),我們可以直接訪問全局對象並在其上設置屬性 4.2 ,然后它將作為代碼中其他地方的全局變量提供。 [2]

    我們不是采用上面的eval方法並通過我們在全局上下文中編寫的代碼獲得對全局對象的訪問,而是發現我們可以在使用null調用的任何函數中訪問全局對象作為this10.4.3

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

唷。

好的,對於那些沒有從規范鏈接和eval調用中暈倒的人來說,還有更多閱讀:

  1. @kangax 非常徹底地涵蓋了所有的基礎。 說真的,請閱讀如果您有任何問題我在這里沒有回答(包括那些與最重要的特性瀏覽器支持有關的問題!)
  2. 很明顯的是ECMAScript 5規范本身的相關章節,以獲取事情是如何打算在一個理想的世界里工作的想法。 不,真的; 我知道規格是一個可怕的想法,但ES(“JavaScript”)規范是我見過的最容易閱讀和最易理解的規范之一。 他們真的很棒。 值得注意的是,並沒有特別的順序,

    • 10.4建立執行上下文 :具體說明如何處理“全局代碼”和“評估代碼”。
    • 10.2詞匯環境 :這些描述“存儲變量的地方。”(感興趣的“全球環境”就是其中之一。)
    • 10.1可執行代碼的類型 :涵蓋“全局代碼”和“程序”。
    • 15.1全球對象 :遺憾的是,與其標題相比,它的相關性要差得多。 值得一試。

[1]:在其他答案中的討論,表明Node.js和其他CommonJS兼容系統中的exports在某種程度上與全局對象有關,這個問題要求誤導。 在系統設計方面,人們可能更適合使用他們的環境模塊工具,而不是在全局對象上徘徊......但這是對另一個Stack Overflow帖子的討論。 (=

[2]:對於那些跟隨規范的人來說,更難以證明全局對象的屬性成員可以作為Identifier dereferences訪問。 10.2.1.2 對象環境記錄10.2.3 全局環境開始 ,了解全局對象如何鏈接到環境,然后按順序跳到18.12.3,18.12.218.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';
}

通過這種方式,我實現了全局變量。

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的內容, foo是一個在比函數更高的范圍內聲明的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM