2017-05-25 40 views
0

我覺得這個問題很奇怪。 不知何故,我覺得答案應該是非常明顯的。但事實並非如此。函數參數而不是直接參考

在Java腳本中,考慮到在另一個對象的作用域內,我可以直接訪問任何周圍作用域中的變量並將其變異。爲什麼我會選擇將這些變量作爲參數傳遞給函數而不是直接引用?最佳做法是什麼?什麼時候會選擇傳遞某些東西而不是使用直接引用方法?這只是一個問題,如果我想引用實際的變量或僅僅是它的值,類似於C語言系列中使用的系統類型?

例如:

我爲什麼這樣做:

var foo= 1; 
var bar = function(foo) { 
    return foo + 2; 
} 

相反的:

var foo = 1; 
var bar = function() { 
    return foo + 2; 
} 

這使得有點道理:

var bar = function(foo) { 
    return foo + 2; 
} 
foo = bar(42); // foo = 44 
+0

以及你的第一個和最後一個,富里是不一樣foo的外面.... – epascarello

+0

功能不引用閉包變量的函數是「純」函數,並且可以隨意移動它們;他們沒有被綁定到他們的具體位置。當代碼開始膨脹並且需要組織時,這可以提供幫助。 –

回答

0

我可以直接訪問任何周圍範圍內的變量,並將它變成垃圾。

是的,這是人們想要防範的事情之一。

爲什麼我會選擇將這些變量作爲參數傳遞給函數而不是直接引用?

可重用性,基本上。通過顯式傳遞值,可以a)傳遞其他值,而不是作用域中變量的值b)通過將函數聲明放在不同的作用域中輕鬆地重構代碼,而不必重寫它。

此外,依賴注入:即使你期望的變量是一個常量,要引用,使其成爲一個參數允許注入嘲笑等

什麼是最好的做法是什麼?

明智地選擇:-)把一切參數通過在參數的一切缺點都滿足上述優點 - 長參數列表並且必須通過周圍的一切有相當一些開銷。所以當你不需要重用函數,也不需要注入任何其他值(例如,在給定的常量的情況下),就沒有理由這樣做。

0

的使用取決於你要解決

全球範圍變量處理當值可以在其他業務中重用的問題的類型

let Person = (() => { 

    let Person = function() { 
     this.name = null; 
    } 
    /** 
    * You can also occupy private variables so that you 
    * can not access them externally to your logic 
    */ 
    let privateVariable = null; 

    Person.prototype = { 
     setName: (name) => { 
      this.name = name; 
     }, getName:() => { 
      return this.name; 
     } 
    } 

    return Person; 
})(); 

// Use: 
person = new Person(); 
person.setName('Alan'); 
console.log(person.getName()); // log: Alan 

在另一方面也有當你佔用局部範圍的變量 當你不會在後續操作中佔用該值時,將處理局部範圍變量。它是在圖書館

let Library = (() => { 
     /* 
     * When dealing with this type of programming all the logic 
     * of your program falls into the functions but when 
     * you use an anonymous function like this 
     * you can define variables to support you 
     * 
     **/ 
     let CONSTANT = 2; 

     return { 
      operation1: (param1) => { 
       return param1 * 2; 
      }, 
      operation2: (param1) => { 
       return param1 * CONSTANT; 
      } 
     } 
})(); 

// Use: 
let result = Library.operation1(42); 
console.log(result); // 84 

我希望這對你的作品很常見的用途,至於

+0

第一個例子令人困惑,因爲它不會在任何地方使用'privateVariable' – Bergi