js函数作用域和声明提前
2014-12-02 19:45
253 查看
说到作用域,首先来认识一下常见的两个作用域。
块级作用域(block scope):在一些类c的编程语言中,花括号内的每一段代码都具有各自的作用域。
函数作用域(function scope):javascript的变量在声明它们的函数体以及这个函数体嵌套的任意函数内都是有定义的。
function test(){
for(var i=0;i<3;i++){
console.log(i); // 输出 0 1 2
}
console.log(i); // 输出 3
}
由此可见,i离开循环体,在函数中也是有定义的。
也就是说,js的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。
那么,什么叫声明提前?我们先看一段代码。
var scope = "global";
function test(){
console.log(scope); //输出undefined,而不是global
var scope = "local"; //变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的。
console.log(scope); //输出local
}
刚开始我也以为函数第一行会输出global,因为代码还没有执行到var语句声明局部变量的地方。
然而,由于函数作用域的特性,上述过程等价于:将函数内的scope声明“提前”到函数的顶部,同时变量初始化留在原来的位置。
在块级作用域中,将变量的声明和使用变量的代码靠在一起,是个好习惯;但是在函数作用域中,我个人喜欢将变量的声明放在开头。^_^
块级作用域(block scope):在一些类c的编程语言中,花括号内的每一段代码都具有各自的作用域。
函数作用域(function scope):javascript的变量在声明它们的函数体以及这个函数体嵌套的任意函数内都是有定义的。
function test(){
for(var i=0;i<3;i++){
console.log(i); // 输出 0 1 2
}
console.log(i); // 输出 3
}
由此可见,i离开循环体,在函数中也是有定义的。
也就是说,js的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。
那么,什么叫声明提前?我们先看一段代码。
var scope = "global";
function test(){
console.log(scope); //输出undefined,而不是global
var scope = "local"; //变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的。
console.log(scope); //输出local
}
刚开始我也以为函数第一行会输出global,因为代码还没有执行到var语句声明局部变量的地方。
然而,由于函数作用域的特性,上述过程等价于:将函数内的scope声明“提前”到函数的顶部,同时变量初始化留在原来的位置。
在块级作用域中,将变量的声明和使用变量的代码靠在一起,是个好习惯;但是在函数作用域中,我个人喜欢将变量的声明放在开头。^_^
相关文章推荐
- js 函数作用域之声明提前
- js中变量的函数作用域和声明提前
- js的函数作用域 以及声明提前
- js的函数作用域 以及声明提前
- javascript的函数作用域及声明提前
- 初探JavaScript——JS另类的作用域和声明提前。
- 函数作用域和声明提前
- javascript中的函数作用域和声明提前
- javascript的函数作用域及声明提前
- 函数作用域和声明提前
- js 面试测试题--函数声明提前
- js变量声明提升,变量作用域与函数作用域,作用域链
- JS的作用域和声明提前,js中局部变量泄露为全局变量
- js 函数定义,使用,作用域,变量声明提升,遇解析.....
- JS关于声明提前、按值传递和作用域的经典问题
- 函数作用域和声明提前
- 从零开始学_JavaScript_系列(20)——js系列<7>(函数原型的两种声明方式、函数的作用域)
- js 全局变量、局部变量的作用域;变量声明提前;无块级作用域
- javascript基础(函数与方法的区别,变量作用域,变量和函数的声明提前,函数作用域)(十五)
- JS的作用域和声明提前