use*_*589 4 javascript debugging hoisting angularjs
为什么以下代码片段在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
};
Run Code Online (Sandbox Code Playgroud)
即使student在使用它并且student没有悬挂的功能之后仍然为什么上述功能仍然有效?
但与上面的例子相比,这个:
(function(){
console.log("Name is :"+student);
})();
var student = {
name:"xyz"
};
Run Code Online (Sandbox Code Playgroud)
显示student作为undefined意味着它没有悬挂.
.controller注册一个控制器功能但不立即执行 - 它将它排入后续阶段.然后,为student变量分配一个对象.
但是,该控制器函数是对student变量的闭包- 换句话说,它在运行时可以访问它.阅读更多关于闭包的信息.因此,当它最终执行时,student定义变量.
相反,第二个例子console.log,无论是否包含在立即调用的函数表达式中,都在 student赋值变量之前执行,所以它是undefined.
第一个示例和第二个示例之间存在细微差别.在第一个例子中,有两个功能块,在第二个例子中,只有一个.
这两个示例都是立即调用的,但是第二个函数立即尝试访问尚未定义的外部变量,第一个只执行一个函数来注册控制器(因此,不执行控制器函数的内容) ).
当角度框架调用控制器的构造函数时,外部变量已被定义,并且是闭包环境的一部分.
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |