您必須將我鏈接到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默認設置的方式,你也可以編寫它。
嗨,變量像往常一樣懸掛。但是在JavaScript的其餘部分,作業不會提起!這意味着,在這種情況下,您的'$ scope.dumbValue'將得到空/未分配的值。 – 2014-10-08 16:36:33
如果您考慮一下,提升分配將毫無意義,因爲RHS可能取決於必須首先計算的其他值。 – 2014-10-08 16:41:12