您預期的功能提升的情況發生:
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!');
}
這與angular沒有任何關係,它是關於JavaScript的。 JS是一種解釋型語言,它意味着程序將逐行瀏覽代碼,編譯並執行程序。 $ scope.myFunc將不會存在,直到程序達到設定的行數爲止 - 它不會向前看。 – Charlie