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
            		})();
    

      

  • 相关阅读:
    git
    代理上网时git不能直接连接远程库的解决办法
    Python程序练习2--模拟三级菜单
    python os模块常用文件操作方法
    Python程序练习1-模拟用户登录验证
    牛牛牛图片胡乱下载
    oozie 4.1.0与4.2.0版本问题BUG
    hbase 协处理器,实现group by,distinct函数
    Js公共操作类 之 String 扩展方法介绍(一)
    CSS3之伪元素选择器和伪类选择器
  • 原文地址:https://www.cnblogs.com/alideai/p/8034789.html
Copyright © 2011-2022 走看看