2009-11-01 69 views
0

我在js文件中有以下奇怪的代碼,我需要一些幫助理解發生了什麼。我感到困惑的是,爲什麼整個事情都會陷入困境?那是什麼意思 ?需要一些幫助來理解這個JavaScript

(function() { 
    var someobj = window.someobj = []; 
    var parentId = '#wrapper'; 

    $(document).ready(function() { 
    //some code here 
    }); 


    $(document).ready(function() { 
    //some code here  
     } 
    }); 
+2

你不向我們展示足夠的代碼。請帶我們通過至少與首位左括號相符的右括號。到目前爲止我們知道的是我們有一個匿名函數被定義。代碼(function(){})();通常用於設置某些東西而不污染全局名稱空間。 – Nosredna 2009-11-01 20:17:32

回答

0

我將假設這實際上是匿名函數定義的一部分,這就是它在括號中的原因。我可以看到,如果有某種邏輯會使window.someobj根據不同的條件發生變化,但是還有代碼做同樣的事情,那麼可以這樣做。

0

括號實際上並不是必要的,只要這段代碼去。這段代碼似乎並不完整。該函數通過將變量設置爲頁面上的某個對象並設置另一個常量來初始化。然後有兩個看起來相同的觸發器會在頁面加載時觸發一些代碼。

看起來好像不是一段非常有用的代碼。有一些更大的部分可以說明這一點嗎?

0

在JS,你可以聲明函數,之後會自動調用它:

( function Test() { alert('test'); } )();

1

外括號是多餘的位置(有代碼中的錯字,雖然,我認爲你錯過了關閉);)。有時,爲了清楚起見,當人們立即調用函數時,人們會在括號中包裝一個函數,例如,

(function($) { 
    //some jQuery code  
})(jQuery); 

在上面的函數中,參數$將具有外部jQuery變量的值。這是在jQuery和jQuery插件中完成的,以防止$符號與其他框架衝突。

+1

這不是一個清晰的問題,它是一個語法規則。 '(函數(){的console.log(1);})();'工作,其中如'函數(){的console.log(1);}();'導致錯誤。 – 2009-11-01 20:25:14

+0

有趣而'函數(){的console.log(1);}();'導致語法錯誤,'VAR X =函數(){的console.log(1);}();'沒有。 – 2009-11-05 18:23:41

0

圓括號定義了一個臨時範圍。在JavaScript中這樣做有時候很有用。有約翰Resig的優秀導遊,以學習了大量的實例和進一步的解釋高級JavaScript:

http://ejohn.org/apps/learn/#57

3

如果您所提供的代碼完成(用的是什麼兩個$(document).ready(function() {});語句中除外),比這個代碼什麼都不做,並且這個函數永遠不會執行。無論是否包裝圓括號都是一樣的。

通過在括號中包裝功能,您可以創建一個anonymousfunction。但是,函數必須立即執行,或者存儲在一個變量中(這會取消匿名部分)。您經常會看到這種技術,以避免使用臨時變量或僅用於初始化較大應用程序的變量來污染全局範圍。例如。

(function() { 
    // Do initialization shtuff 
    var someLocalVariable = 'value'; 
})(); 
// Notice the `();` here after the closing parenthesis. 
// This executes the anonymous function. 

// This will cause an error since `someLocalVariable` is not 
// available in this scope 
console.log(someLocalVariable); 

那麼,你的代碼缺少的是在函數結束時,右括號後的();。這裏是你的代碼(大概)看起來像:

(function() { 
    var someobj = window.someobj = []; 
    var parentId = '#wrapper'; 

    $(document).ready(function() { 
    //some code here 
    }); 


    $(document).ready(function() { 
    //some code here  
    }); 
})(); 
2

它看起來並不像這個代碼是完整的。正如所寫的,這段代碼根本不會做任何事情。你是否錯過了一個近親和一個額外的圓括號?

在JavaScript中,沒有模塊系統,因此沒有辦法來創建其自己的頂級定義一個模塊,不要與可能被用於其他模塊衝突。

爲了克服這個問題,人們用匿名函數的定義,以避免名稱衝突。你所做的是創建一個匿名函數,並立即執行它。

(function() { /* do stuff */ })(); 

這將創建一個函數,然後立即執行它,不帶任何參數。定義的變量使用該函數內var不會定義其他地方的變量發生衝突,從而你會得到你自己的,私人的命名空間相當於,像什麼模塊系統將提供。