Javascript 这个有角度的JS代码段是如何工作的?

Javascript 这个有角度的JS代码段是如何工作的?,javascript,angularjs,debugging,hoisting,Javascript,Angularjs,Debugging,Hoisting,为什么以下代码段在Angular JS中工作 var app = angular.module('store',[]); (function(){ app.controller('StoreController',function(){ this.blabla = student; }); })(); var student = { name:"Abc Def", rollNumber:12, isBrilliant: true

为什么以下代码段在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
变量被分配一个对象

然而,该控制器函数是
student
变量的闭包-换句话说,它在运行时可以访问它。因此,当它最终执行时,
student
变量被定义


相比之下,第二个示例的
console.log
,无论是否包含在立即调用的函数表达式中,都在分配
student
变量之前执行,因此它是
未定义的

第一个示例和第二个示例之间存在细微差别。在第一个示例中,有两个功能块,在第二个示例中,只有一个功能块

这两个示例都会立即调用,但如果第二个函数立即尝试访问尚未定义的外部变量,则第一个函数仅执行一个函数来注册控制器(因此,不执行控制器函数的内容)


当angular框架调用控制器的构造函数时,外部变量已经定义,并且是闭包环境的一部分。

this.blablabla=student在Angular实例化控制器之前不会执行,这将在您定义student之后发生。这是因为Angular使用摘要循环并不断更新$scope和其他的值。。。。因此,它重复检查并更新$scope,并使用更新的valuesCheckout文章更新第二点。这不是因为它是一个全局变量,而是因为它是函数闭包中的一个变量。是的,我会尝试清理一下。