簡體   English   中英

如何將參數傳遞給匿名Javascript函數?

[英]How do I pass argument to anonymous Javascript function?

我正在編寫一個簡單的計數器,並且我想使用戶的安裝非常簡單。 我見過的最簡單的計數器代碼(針對安裝它的用戶)之一是Google Analytics(分析)代碼

因此,我想將主要代碼存儲在文件中,要安裝我的計數器的用戶只需設置如下的websiteID:

<html><head><title></title></head><body>
<script type="text/javascript" src="http://counterhost.lan/tm.js">
var websiteId = 'XXXXX';
</script>
</body></html>

這是我的代碼:

<script type="text/javascript" src="http://counterhost.lan/tm.js">
var page = _gat.init('new');
</script>

這是我的JS文件:

(function() {
    var z = '_gat';
    var aa = function init(data) { alert(data); alert(z);};

    function na() {
        return new z.aa();
    }
    na();
})();

我試圖了解Google Analytics(分析)的javascript代碼,但未能做到這一點。 誰能建議我如何指定標簽之間的變量,然后以javascript文件中的匿名函數讀取它? 謝謝。

在您的示例中, websiteId是全局變量。 因此它可以在任何地方訪問,包括匿名函數,除非有一個同名的局部變量

<script> var websiteId = "something"; </script>

稍后在頁面或包含的js文件中...

(function() {
    alert(websiteId); //this should work
})();

誰能建議我如何指定標簽之間的變量,然后讀取它[...]

如果您的標簽同時具有SRC屬性和JS內容,則不會。

<script type="text/javascript" src="http:/x.com/x.js"></script>

..與...不同,

<script type="text/javascript">
    var x = 1;
</script>

Dojo是一個可以向JSRIPT標簽添加JS變量的框架。 因此,如果您使用的是Dojo,則可以通過編寫以下代碼將變量添加到全局djConfig哈希中:

<script type="text/javascript" src="mxclientsystem/dojo/dojo.js"
    djConfig="
    usePlainJson: true,
    parseOnLoad: true
">
</script>

Dojo通過運行SCRIPT標記並評估自定義djConfig屬性來完成此操作。

但是,這不能解決您的問題。

您確實需要兩個SCRIPT標簽。 有一句話,

<script type="text/javascript">
    var websiteId = '123456';
</script>

這將設置一個全局變量websiteId和另一個,

<script type="text/javascript" src="http:/x.com/myreporter.js"></script>

可以從任何地方加載並讀取websiteId變量,我假設將其報告回來。

您可以像這樣將變量傳遞給匿名函數:

(function(arg1, arg2, arg3) {
    alert(arg1);
    alert(arg2);
    alert(arg3);
})("let's", "go", "redsox");

// will alert "let's", then "go", then "redsox" :)

我不清楚您要問什么,但是...

您可以使用id屬性標記任何HTML元素,然后使用
document.getEntityById()以檢索該特定元素。

您還可以給HTML元素用戶定義的屬性具有自己選擇的名稱,然后在Javascript中為該元素獲取並設置它們。

我認為您對JS對象的調用方式有些困惑。

z是字符串'_gat' 您不能在其上調用aa() ,因為字符串沒有名為aa成員。 aa是存儲在局部變量中的獨立函數。 即使您確實調用了aa() ,它也不會返回任何內容,因此對結果使用new運算符是沒有意義的。 new只能在構造函數上調用。

我猜你的意思是這樣的:

var _gat= function() {

    // Private variable
    //
    var data= null;

    // Object to put in window._gat
    //
    return {

        // Set the private variable 
        //
        init: function(d) {
            data= d;
        }
    };
}();

然后像第二個示例中那樣調用_gat.init('foo')會將變量設置為網站_gat.init('foo') 'foo' 之所以_gat是因為_gat對象是在匿名函數內定義的return {init: function() {...}}對象,並在隱藏的data變量上保留了引用(“ closure”)。

如果您將src屬性指定為script元素的一部分,則script元素標簽本身內的任何代碼都不會執行。 但是,您可以使用以下代碼添加此功能。 我從Crockford(我相信是他)那里獲得了這項技術,他在演講中談到了無關的主題,即渲染性能,並為此目的將腳本異步加載到頁面中。

JavaScript:

(function() {
    // Using inner class example from bobince's answer
 var _gat = (function() {
     var data= null;

     return {
         init: function(d) {
          console.info("Configuration data: ", d);
             data = d;
         }
     }
 })();

 // Method 1: Extract configuration by ID (SEE FOOT NOTE)
 var config = document.getElementById("my-counter-apps-unique-and-long-to-avoid-collision-id").innerHTML;

 // Method 2: search all script tags for the script with the expected name
 var scripts = document.getElementsByTagName("script");

 for ( var i=0, l=scripts.length; i<l; ++i ) {
  if ( scripts[i].src = "some-script.js" ) {
   config = scripts[i].innerHTML;
   break;
  }
 }

 _gat.init( eval("(" +config+ ")") );
})();

HTML:

<script type="text/javascript" src="some-script.js" id="my-counter-apps-unique-and-long-to-avoid-collision-id">
 {some: "foo", config: "bar", settings: 123}
</script>

兩種方法都有其缺點:

  1. 使用唯一且不會沖突的ID將使確定正確的腳本元素更加准確和快捷; 但是,這不是有效的HTML4 / XHTML標記。 在HTML5中,您可以定義任意屬性,因此在那時不會有問題

  2. 此方法是有效的HTML標記; 但是,如果您的網址可能更改(例如:http vs https),那么我展示的簡單比較可能會很容易中斷,並且可能需要一種更強大的比較方法

關於eval的注釋

兩種方法都使用eval 關於此功能的典型口頭禪是“評估是邪惡的”。 然而,去與說使用eval 不知道的危險eval是邪惡的。

在這種情況下, script標記中包含的數據AFAIK不會受到注入攻擊,因為在將HTML解析為DOM時,一旦到達該評估腳本(顯示的代碼),該腳本便立即執行。 先前可能已定義的腳本無法訪問計數器的script標記中包含的數據,因為該節點在執行時就不在DOM樹中。

可能的情況是,從先前包含的腳本執行的適時的setTimeout可能能夠在計數器script的包含與評估時間之間的時間運行; 但是,情況可能會也可能並非如此,並且如果可能,取決於CPU負載等,情況可能會不一致。

如果您擔心這個故事的寓意,請添加一個非eval的JSON解析器,然后改用它。

暫無
暫無

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

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