2014-12-22 49 views
0
pokeApp.controller('mycontroller', function($scope, $routeParams){ 


    // part 1: // why would this not work 
    $scope.myFunc();  

    $scope.myFunc = function(){ 
     console.log("Hi !"); 
    } 

    // part 2: // why would this not work 

    this.helloWorld(); 
    this.helloWorld = function(){ 
     console.log("Hello World"); 
    } 
} 

嗨 我的問題是爲什麼這兩個東西不能工作;我的意思是要麼在控制器中要麼在範圍內。我知道我可以調用一個簡單定義的函數'function helloWorld(){...}'angularjs從控制器內部調用函數

謝謝!

回答

1

您在函數定義之前調用函數。你的代碼更改爲:

$scope.myFunc = function(){ 
     console.log("Hi !"); 
    } 
    $scope.myFunc(); 
+1

這與angular沒有任何關係,它是關於JavaScript的。 JS是一種解釋型語言,它意味着程序將逐行瀏覽代碼,編譯並執行程序。 $ scope.myFunc將不會存在,直到程序達到設定的行數爲止 - 它不會向前看。 – Charlie

1

您預期的功能提升的情況發生:

myFunct(); 
 

 
    function myFunct() { 
 
     alert('hey'); 
 
    }

這會工作。

但這並不:

myFunct(); 
 

 
var myFunct = function() { 
 
    alert('hey'); 
 
}

類似的情況下發生的事情與控制器作用域屬性,這正好表現爲在這種情況下,一個普通的變量,意味着沒有發生吊裝。

你會發現這裏hoising一些很好的解釋:var functionName = function() {} vs function functionName() {}


因此,爲了在使用提升功能你原來的代碼工作的一切,它應該是這樣的:

pokeApp.controller('mycontroller', function($scope, $routeParams){ 


    // part 1: 
    myFunc();  

    function myFunc(){ 
     console.log("Hi !"); 
    } 

    // part 2: 

    helloWorld(); 
    function helloWorld(){ 
     console.log("Hello World"); 
    } 
} 

或者說,有點哈克的方式來維持的範圍:

pokeApp.controller('mycontroller', function($scope, $routeParams){ 


    // part 1: 
    $scope.myFunc = myFunc; // this is the key, assigns a hoisted function value 
          // to the $scope object property which is then ready 
    $scope.myFunc();  

    function myFunc(){ 
     console.log("Hi !"); 
    } 

    // part 2: 
    this.helloWorld = helloWorld; 
    this.helloWorld(); 
    function helloWorld(){ 
     console.log("Hello World"); 
    } 
} 

下面是一個片段,顯示在行動中:

var myObj = {}; 
 
    myObj.f = myFunct; 
 
    myObj.f(); 
 

 
    function myFunct() { 
 
     alert('yay, it still works!'); 
 
    }

相關問題