javascript中的函数作用域和声明提前
2013-11-24 19:04
477 查看
在一些类C的编程语言中,花括号内的每一段代码都具有各自作用域,并且变量在声明他们的代码段之外是不可见的,这个概念叫做块级作用域。
javascript中没有块级作用域的概念,有的是函数作用域的概念:变量在声明他们的函数体内部的任何位置(包括这个函数体嵌套的任何函数体内)都是可读取的。
简单的说,上面的在不同位置定义的三个变量:i,j,k都是同一个作用域--整个函数体。由于这个原因,这就意味着变量在声明之前甚至已经可用了。这个特性叫做声明提前。
比如下面这个例子,myfield为全局变量,在自定义函数中使用输入的时候,直接输出为此变量的当前值
但是如果在函数中声明了一个同名的局部变量,如果这个局部变量的声明语句在变量使用之后,如下图所示的输出结果可能和自己想象中的不太一样。
出现这个现象的原因是,局部变量在整个函数体中有定义,这个局部变量遮盖了全局变量。局部变量的声明提前了,但是变量的初始化并没有提前,还是在原来的位置。
因此,上面这段代码等价于如下:
javascript中没有块级作用域的概念,有的是函数作用域的概念:变量在声明他们的函数体内部的任何位置(包括这个函数体嵌套的任何函数体内)都是可读取的。
var k = "k"; if(1===1){ var j ="j"; for (var i = 0; i < 3; i++) { console.log(i); } console.log(i);//输出3,表明i不仅仅在循环中有定义,在代码段中也有定义 } console.log(j);//输出j:表明j在不仅仅在代码段内有定义 console.log(i);//输出3:表明i在循环中有定义,在代码段中有定义,另外在整个函数体各处都有定义 console.log(k);//输出k:很明显是在整个函数各处都有定义
简单的说,上面的在不同位置定义的三个变量:i,j,k都是同一个作用域--整个函数体。由于这个原因,这就意味着变量在声明之前甚至已经可用了。这个特性叫做声明提前。
比如下面这个例子,myfield为全局变量,在自定义函数中使用输入的时候,直接输出为此变量的当前值
但是如果在函数中声明了一个同名的局部变量,如果这个局部变量的声明语句在变量使用之后,如下图所示的输出结果可能和自己想象中的不太一样。
出现这个现象的原因是,局部变量在整个函数体中有定义,这个局部变量遮盖了全局变量。局部变量的声明提前了,但是变量的初始化并没有提前,还是在原来的位置。
因此,上面这段代码等价于如下:
相关文章推荐
- javascript的函数作用域及声明提前
- javascript的函数作用域及声明提前
- javascript的函数作用域及声明提前
- javascript基础(函数与方法的区别,变量作用域,变量和函数的声明提前,函数作用域)(十五)
- javascript中函数作用域和声明提前
- javascript 函数作用域和声明提前 十七
- JavaScript中提前声明变量或函数例子
- Javascript编程笔记一:理解变量和函数提前声明
- JavaScript 函数总体概述(函数声明/参数传递/返回值/加载/变量和作用域/变量声明提升/匿名函数/回调函数)
- 深入理解javascript的作用域--函数声明为什么会前置
- javascript的函数声明提前例子
- js 函数作用域之声明提前
- JavaScript 函数声明提前
- 从零开始学_JavaScript_系列(20)——js系列<7>(函数原型的两种声明方式、函数的作用域)
- javascript中不存在块级作用域,所以要小心使用在块级作用域中的函数声明所带来的作用域混乱.
- JavaScript中对变量和声明函数的“提前”(hoist)
- js函数作用域和声明提前
- JavaScript中提前声明变量或函数例子
- 初探JavaScript——JS另类的作用域和声明提前。
- 函数作用域和声明提前