函数参数而不是直接引用

时间:2017-05-25 00:03:15

标签: javascript

我对这个问题感到很奇怪。 不知怎的,我觉得答案应该很明显。但事实并非如此。

在Java Script中,考虑到在另一个对象的范围内,我可以直接访问任何周围范围内的变量,并改变它的废话。为什么我会选择将这些变量作为参数传递给函数而不是直接引用?什么是最佳做法?何时会选择将某些内容作为参数传递而不是使用直接引用方法?是否只需要引用实际的var或仅仅是它的值,这类似于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 

2 个答案:

答案 0 :(得分:0)

  

我可以直接访问任何周围范围内的变量,并改变它的废话。

是的,这是人们想要防范的事情之一。

  

为什么我会选择将这些变量作为参数传递给函数而不是直接引用?

基本上可重用性。通过显式传递值,可以a)传递除了范围b)中的变量之外的其他值,通过将函数声明放在不同的范围内,轻松地重构代码,而不必重写它。

此外,依赖注入:即使你期望变量是你想要引用的常量,使它成为一个参数允许注入模拟等。

  

最佳做法是什么?

明智地选择:-)将所有内容放在参数中的上述优点通过在参数中包含所有内容的缺点来满足 - 长参数列表和必须传递一切都有相当多的开销。因此,如果您不是绝对需要重用该函数,并且不需要注入任何其他值(例如,在给定常量的情况下),则没有理由这样做。

答案 1 :(得分: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

我希望这适合你,问候

相关问题