zoukankan      html  css  js  c++  java
  • JavaScript函数作用域和声明提前(3.10.1 page.57)

    <h4>3.函数作用域和声明提前</h4>
            <p>
            	<!--<script type="text/javascript">-->
            		<pre>
            		(function test (o) {
            			var i = 0;
            			if (typeof o =="object") {
            				var j = 0;
            				for (var k =0;k<10;k++) {
            					console.log(k);
            				}
            				console.log(k);
            			}
            			console.log(j);
            		})(null);
            		</pre>
            	<!--</script>-->
            </p>
    

      在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,我们称为块级作用域(block scope),而JavaScript中没有块级作用域。JavaScript取而代之地使用了函数作用域(function scope):变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。在上面的代码中,在不同位置定义了变量i,j,k它们都在同一作用域内------这三个变量在函数体内均是 有定义的。

    JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。有意思的是,这以为着变量在声明之前甚至已经可用。JavaScript的这个特性被非正式地称为声明提前(hoisting),即JavaScript函数里声明的所有变量(但不涉及赋值)都被提前至函数体的顶部。

    看这张代码:

    运行出来的结果:undefined  local

    你可能会误以为函数中的第一行会输出“global”,因为代码还没有没有执行带var语句声明局部变量的地方。其实不然,由于函数作用域的特性,局部变量在整个函数体始终是有定义的,也就是说,在函数体内局部变量遮盖了同名全局变量。尽管如此,只有在成语执行到var语句的时候,局部变量才会被真正赋值。因此,上述过程等价于:将函数内的变量声明提前至函数体顶部,同时变量初始化留在原来的位置:

    其实上述的代码是这个样子的。

    var scope ="global";
            		(function f () {
            			var scope;//变量提前声明到这个地方,因为没有赋值,所以值为undefined
            			console.log(scope);//undefined
            			scope = "local";//这里才开始赋值
            			console.log(scope);//值是:local
            		})();
    

      

  • 相关阅读:
    FileUpload的使用
    关于hibernate4的配置我要好好反省一下
    比较SQL Server 2000 数据库中两个库的差异
    用google生活
    用OWC11图形分析本页面及其他页面Table中的数据
    请教ASP.NET培训应该培训的内容和以及顺序
    最近一个快要结束的项目的BUG分析
    我也发软件开发团队的思考(侧重点是人员)
    一个SQL语句的问题,我百思不得其解,请教各位
    分享C#高端视频教程
  • 原文地址:https://www.cnblogs.com/alideai/p/8034789.html
Copyright © 2011-2022 走看看