2013-02-28 37 views
1

我想知道内部函数是什么样的? 我知道,你可以写以下带内部函数的Javascript内部函数

var obj = { 
     test: 'something' 
} 

但在这段代码中,innerfunction并不是指一个变量,而是一个功能。 有没有其他方法来编写/调用内部函数?

function outer(){ 

    var a = "Outerfunction"; 
    console.log(a) 

    innerFct: function InnerFct() {            
      var c = "Inner"; 
      console.log(c) 
    }innerFct(); 
} 
window.outer(); 

谢谢

回答

2

这里有几个不同的事情发生在这里。

在此代码:

var obj = { 
    test: 'something' 
} 

您正在使用“文本对象符号”创造 - 好,有一个物业test的对象和属性具有something

的值。在你的第二个情况下,您正在创建一个代码块(是的,有趣的是,对象和代码块都使用相同的语法{...}来定义它们)

在代码块内部,innerFct: beco mes一个标签。标签与一些控制流程语句一起使用来跳转。忘掉它们,你真的最好不要使用它们。

function outer(){ 
    var a = "Outerfunction"; 
    console.log(a) 

    function innerFct() {            
     var c = "Inner"; 
     console.log(c) 
    } 
    innerFct(); 
} 
outer(); 

甚至

function outer(){ 
    var a = "Outerfunction"; 
    console.log(a) 

    var innerFct = function() {            
     var c = "Inner"; 
     console.log(c) 
    } 
    innerFct(); 
} 
outer(); 
+0

谢谢,这正是我一直在寻找。是的,我知道,第一个是一个字面对象,但我不知道为什么该函数与“:” – xhallix

+0

一起工作。您的原始代码会抛出一个错误:ReferenceError:innerFct没有为我定义。你在哪里使用什么浏览器? –

+0

@ChristophHa - 关于标签的更多信息:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/label –

1

您与objects混淆functions

使用对象时,冒号用于显示键值对。

var object = { 
    innerFct: function(){ 
    console.log('rawr'); 
    }, 
    someVariable: 7 
} 

object.innerFct(); //logs rawr 
object.someVariable = 4; //just changed from 7 to 4 

使用冒号如何在您的示例中有它是不正确的语法。另外当你在这样的对象中创建一个函数时,你不会再次命名这个函数,因为你已经将它分配给对象上的一个名字。

然后,你随时可以做这样的事情编辑功能:

object.innerFct = function(){ 
    //new code 
} 

object.innerFct()会调用该函数。

0

其他答案已经足够覆盖的对象语法和调用范围的功能。正如我在注释中,你可以这样做:

function outer(){ 
    (function() { 
     var c = "inner"; 
     console.log(c) 
    })(); 
} 
window.outer(); 

而且记录inner就好了。

编辑:原始代码示例中的私有/隐藏变量如innerFct也可以在关闭中捕获。

outer = function() { 
    var innerFct = function() { console.log("inner"); } 
    // innerFct is captured in the closure of the following functions 
    // so it is defined within the scope of those functions, when they are called 
    // even though it isn't defined before or after they complete 
    window.wrapper = function() { innerFct(); } 
    return function() { innerFct(); } 
} 
outer(); 

// each of these next three lines logs "inner" 
window.wrapper(); // assigned to global variable 
outer()();   // calling the returned function 
var innerFctBackFromTheDead = outer(); // saving the returned function 
innerFctBackFromTheDead(); 

还有对象构造函数/原型语法。在新的关键字和原型

function Outer() { 
    this.inner = function() { 
     this.c = "inner"; 
     console.log(this.c); 
    } 
} 

var out = new Outer(); 
out.c;  // undefined 
out.inner(); // logs "inner" 
out.c;  // "inner" 

的更多信息:http://pivotallabs.com/javascript-constructors-prototypes-and-the-new-keyword/