为什么我需要返回“init”来执行init函数?

时间:2017-05-12 04:04:20

标签: javascript javascript-objects

我是一个javascript新手,并试图了解功能如何工作。我发现了一个类似的问题here,但它并没有真正回答我的问题。

以下面的javascript为例

var test = function(){
  console.log("kick off");
  var insideTest = "variable inside test";
  var init = function(){
    var insideInit ="variable inside init";
    console.log("inside init");
  }
  return{
    init:init
  }
}

test().init();

以上代码打印以下内容:

kick off
inside init

但如果我删除

return{
init:init
}

它给我一个错误说

  

未捕获的TypeError:无法读取未定义的属性'init'

此外,即使我使用test().init()调用init方法,如果删除了return语句,它也不会打印inside Init

我的问题是为什么有必要返回init:init来执行init方法。

修改 要回答为什么我的init函数在test()函数中,这是我想要做的更大的图片。

var test = function() {
  var init = function() {
    var a = 0;
    function1();
    function2();
  }

  var function1() = function() {
    //some code
  }

  var function1() = function() {
    //some code
  }

  return {
    init: init
  }
}

2 个答案:

答案 0 :(得分:2)

添加了内联评论。内部init内的test也可以访问在其外部定义的变量(init)作为闭包的范围。 test返回一个对象来访问它的内部函数。这个特定的模式是revealing module pattern

var test = function(){
  console.log("kick off");
  var insideTest = "variable inside test";
  // Here init is a function which is private to test function
  // Any function calling test will not have access to init unless it is 'exposed'
  var init = function(){
    var insideInit ="variable inside init";
    console.log("inside init");
  }
  return{
    init:init // exposing the private function
  }
}

答案 1 :(得分:1)

当您返回时,您将返回一个具有init的单个键的Object,您已为其指定了在测试函数中定义的“init”函数。如果您愿意,这允许您返回多个功能,因此您可以链接呼叫。

如果你更喜欢不同的方式,你可以只返回没有花括号的函数,即。 return init;,然后将test()的返回值分配给变量。 var externalInitFnc = test();

编辑:回顾过去,您似乎对Javascript中的范围概念感到模糊。在init函数中定义test时,只能在该函数中访问它。类似于Java类中的私有变量仅在同一个类中可用。