Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解javascript中对象的差异_Javascript - Fatal编程技术网

试图理解javascript中对象的差异

试图理解javascript中对象的差异,javascript,Javascript,在下面的代码示例中,我了解备选方案1和2的工作原理,但我试图了解第三个备选方案。这是什么类型的对象,为什么它在函数前面以括号开始:(函数,为什么它以双括号结束:()。只是好奇,想知道什么是什么和区别吗 备选案文1:(对象文字) 备选案文2:(功能对象) 备选案文3: var something = (function() { var settings = { rows : 10, cols : 3, number : 2 }; })(); 备选方

在下面的代码示例中,我了解备选方案1和2的工作原理,但我试图了解第三个备选方案。这是什么类型的对象,为什么它在函数前面以括号开始:
(函数
,为什么它以双括号结束:
()
。只是好奇,想知道什么是什么和区别吗

备选案文1:(对象文字)

备选案文2:(功能对象)

备选案文3:

var something = (function() {
    var settings = {
    rows : 10,
    cols : 3,
    number : 2
    };
    })();
备选方案3将“something”变量设置为函数的返回值。()实际执行函数

我将使用MDN中的一些内容来展示闭包的好处:


在您的代码中,备选方案3将在某个变量中保留未定义的内容,原因是您的函数没有返回任何值

@Felix已经在上面发布了一个非常好的链接。这基本上是一个IIFE,它被立即调用,该函数的返回值将被分配给某个变量


这种模式的一个关键目标通常是在闭包中隐藏一些状态。函数中定义的任何变量都会产生这种状态。返回对象中的函数可以访问这些变量,但外部世界无法访问这些变量。

请参见和。仅供参考,所有这些代码示例都有不同的功能,因此我不太确定具体是什么你想在这里进行比较。函数是一个对象,是吗?因此,如果你有一个对象
obj
,添加括号只是指定操作顺序。
(obj)
只是引用
obj
(obj)(调用
obj
对象(如果它是函数).和函数声明是表达式,因此可以将它们放在括号中,表达式的值就是函数本身。将它们放在一起:
(function(){})()
创建一个函数,然后调用它。上一个示例中围绕函数的括号是不必要的。有时需要,但这里不需要。第三个示例通常用于控制作用域,捕获闭包中的变量,并避免污染全局命名空间。好的,那么我想也应该有一个返回语句,返回这样的值me value!?我添加了一些关于使用第三种选择的更有用的解释。
var something = function(x,y) {
    return x + y;
}
var something = (function() {
    var settings = {
    rows : 10,
    cols : 3,
    number : 2
    };
    })();
var Counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  };   
})();

alert(Counter.value()); /* Alerts 0 */
Counter.increment();
Counter.increment();
alert(Counter.value()); /* Alerts 2 */
Counter.decrement();
alert(Counter.value()); /* Alerts 1 */