我是一个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
}
}
答案 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类中的私有变量仅在同一个类中可用。