簡體   English   中英

模塊模式擴充

[英]Module pattern augmentation

據我所知,這是對模塊實施寬松擴充的方式:

// file1.js:
var mod = (function(){

    return { foo: 1 }

})();

// file2.js:
var mod = (function(mod){

    console.log(mod); // Object { foo: 1 } 

})(mod || {});

這顯然是可行的,但我想澄清兩件事:

  1. 可以肯定地說,在javascript中聲明具有相同名稱的變量永遠不會引起問題(即使在嚴格模式下)?
  2. 為什么第二個IIFE中的mod參數沒有被第二個var mod覆蓋? 是否在聲明變量之前執行自執行函數?

http://jsfiddle.net/aVV9S/

可以肯定地說,在javascript中聲明具有相同名稱的變量永遠不會引起問題(即使在嚴格模式下)?

這取決於您在何處聲明該變量。 如果在全局范圍內,則如果在全局范圍內也定義了相同名稱的變量,則可能會在其他地方覆蓋您的變量。

為什么第二個IIFE中的mod參數沒有被第二個var mod覆蓋? 是否在聲明變量之前執行自執行函數?

求值順序是這樣的:首先對函數參數進行求值,然后對函數本身求值並調用。 只有在此之后,才將返回值分配給外部mod 您的第二個示例似乎也輸入錯誤; 它可能應該是:

var mod = (function(mod){

    console.log(mod); // Object { foo: 1 } 

})(mod || {});

函數內部的mod僅限於該函數的作用域。 然而,意識到,一旦你調用這個函數, mod是不再視為{ foo: 1}undefined ,因為你沒有返回從IIFE什么。

關於您的評論,您實際上可以在以下片段中看到執行的順序:

var foo = {
    test: function() {
        console.log("hello");
        return 5;
    }
};

var bar = (function(val) {
    console.log("there")
    console.log("bar is", bar);
    return 5;
})(foo.test());
console.log("bar is", bar);

控制台將顯示:

hello
there
bar is undefined
bar is 5

這表明首先評估IIFE的參數,然后評估並調用IIFE本身,最后將值5分配給bar

暫無
暫無

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

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