2014-10-08 20 views
1

我一直在關注John Papa和他的角度指導建議。我喜歡將所有變量和方法提供給控制器頂部的視圖,並依靠javascript在運行時提升變量。我顯然不理解提升以及我認爲我做的。在下面的例子中,我期望在$ scope.dumbValue賦值語句之上提升dumbValue變量聲明;變量不像angularjs中預期的那樣提升

var app = angular.module('plunker', []); 
app.controller('MainCtrl', [$scope, $http]); 
function MainCtrl($scope,$http) 
{ 
    $scope.dumbValue = dumbValue; 
    var dumbValue = 'dumb'; 
} 

但在this Plunker你可以看到,情況並非如此;選擇ng-model值未被初始化。 如果您在變量聲明下移動賦值語句,則會初始化ng模型。

爲什麼JavaScript沒有在作業上面提升var dumbValue,或者它是否和角度處理它的方式有關,我不明白?

+1

嗨,變量像往常一樣懸掛。但是在JavaScript的其餘部分,作業不會提起!這意味着,在這種情況下,您的'$ scope.dumbValue'將得到空/未分配的值。 – 2014-10-08 16:36:33

+0

如果您考慮一下,提升分配將毫無意義,因爲RHS可能取決於必須首先計算的其他值。 – 2014-10-08 16:41:12

回答

3

您必須將我鏈接到Papa爲我確定的建議,但我只看到Papa recommend doing this for "bindable members."他正在討論函數 - 而不是標量值。你試圖做後者,這樣做會遇到問題。

你看,吊裝移動的變量聲明的範圍的頂部,而不是他們的定義(又名分配)。如果你在一個聲明中聲明和定義,吊裝將它分成兩個聲明並提升前者。

所以這個代碼:

var MainCtrl = function ($scope,$http) { 
    $scope.dumbValue = dumbValue; 

    var dumbValue = 'dumb'; 
} 

是一樣的編寫這些代碼(因爲提升它變成這樣):

var MainCtrl = function ($scope,$http) { 
    var dumbValue; // declared, not defined (hence the value `undefined`) 

    $scope.dumbValue = dumbValue; // assignment of `undefined` to a property of $scope 

    dumbValue = 'dumb'; // definition of your variable with a string value 
} 

正如我所說的,但是,爸爸在談論功能,這將被綁定到$scope。他說,而不是這樣做:

var MainCtrl = function ($scope,$http) { 
    function foo() {}; 

    $scope.foo = foo; 
} 

這樣做:

var MainCtrl = function ($scope,$http) { 
    $scope.foo = foo; 

    function foo() {}; 
} 

這工作,因爲吊裝命名函數語句與新變量的函數定義變量聲明轉換,然後並將它們拆分成兩個單獨的陳述,並把它們放在頂部。

var MainCtrl = function ($scope,$http) { 
    var foo; 

    foo = function() {}; 

    $scope.foo = foo; 
} 

此不同的治療命名的函數語句的,因爲你可以看到,允許foo的結合之前已被定義爲一個函數:所以爸爸的建議版本(即最後一個代碼塊)被提升到轉換$scope發生。

就我個人而言,我不喜歡爸爸的推薦。儘管我個人理解提升並且沒有受到影響,但我看到許多開發人員通過編寫在提升中變化的代碼來創建問題。在這種情況下,爲了避免我的代碼被大多數開發人員誤解,我非常特別地編寫我的代碼,因爲提升程序會轉換它。這是JSLint's默認設置的方式,你也可以編寫它。

+0

感謝您的詳細解釋。你是對的 - 我很困惑,因爲我可以依賴函數語句來提升我使用變量聲明的方式。 – tim 2014-10-08 17:00:08

1

當你這樣做...

var app = angular.module('plunker', []); 
app.controller('MainCtrl', [$scope, $http]); 
function MainCtrl($scope,$http) 
{ 
    $scope.dumbValue = dumbValue; 
    var dumbValue = 'dumb'; 
} 

這實際上是發生了什麼事情。

var app = angular.module('plunker', []); 
app.controller('MainCtrl', [$scope, $http]); 
function MainCtrl($scope,$http) 
{ 
    var dumbValue = undefined; 
    $scope.dumbValue = dumbValue; 
    dumbValue = 'dumb'; 
} 

因此,該變量被掛起,但設置爲未定義。然後它會得到它的價值,但在這種情況下太晚了。這就是爲什麼不建議提升變量的原因。總是把這些放在最上面。