2013-02-28 44 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/