JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念
<html> <body> <script type="text/javascript"> //JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释 myname = "global"; // global variable function func() { //var myname; // 等同于 -> var myname = undefined; //alert(myname); // "undefined" //myname = "local"; //alert(myname); // "local" //JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。 //只要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。 //当你使用了一个变量,在函数中又重新声明的话,就可能产生逻辑错误(可能不是预期使用全局变量,而是变成局部变量 undefined) //所有的变量声明当被悬置到函数的顶部了,myname被当做了函数的局部变量(尽管是之后声明的) alert(myname); // "undefined" var myname = "local";//如果这个前面不加var 则上面的myname使用全局变量弹出global alert(myname); // "local" from_func_global = "test"; } func(); var my_var = "myvar"; //每个JavaScript环境有一个全局对象,当你在任意的函数外面使用this的时候可以访问到。你创建的每一个全部变量都成了这个全局对象的属 性。 //在浏览器中,方便起见,该全局对象有个附加属性叫做window,此window(通常)指向该全局对象本身。 //JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性 //通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。 //无var创建的 隐式全局变量(无视是否在函数中创建)是能被删除的。 //隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete 操作符删除的,而变量是不能删除的 // 试图删除 alert(delete my_var); // false alert(delete myname); // true alert(delete from_func_global); // true // 测试该删除 alert(typeof my_var); // "string" alert(typeof myname); // "undefined" alert(typeof from_func_global); // "undefined" </script> </body> </html>