[英]How does this Angular JS code snippet work?
為什么以下代碼片段在Angular JS中有效?
var app = angular.module('store',[]);
(function(){
app.controller('StoreController',function(){
this.blabla = student;
});
})();
var student =
{
name:"Abc Def",
rollNumber:12,
isBrilliant: true,
isMale:false,
isFemale: false,
istest:true
};
即使student
在使用它的功能之后並且student
沒有被吊起,為什么上述功能仍然有效?
但與上面的例子相比,這個:
(function(){
console.log("Name is :"+student);
})();
var student = {
name:"xyz"
};
將student
視為undefined
意味着student
undefined
被提升。
.controller
注冊一個控制器函數,但不立即執行它 - 它將它排入以后的階段。 然后,為student
變量分配一個對象。
但是,該控制器函數是對student
變量的封閉 - 換句話說,它可以在運行時訪問它。 閱讀更多關於閉包的信息 。 因此,當它最終執行時,定義了student
變量。
相比之下,第二個示例的console.log
,無論是否包含在立即調用的函數表達式中,都在分配student
變量之前執行,因此undefined
。
第一個示例和第二個示例之間存在細微差別。 在第一個例子中,有兩個功能塊,在第二個例子中,只有一個。
這兩個示例都是立即調用的,但是第二個函數立即嘗試訪問尚未定義的外部變量,第一個只執行一個函數來注冊控制器(因此,不執行控制器函數的內容) )。
當角度框架調用控制器的構造函數時,外部變量已被定義,並且是閉包環境的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.