JavaScript中的变量和闭包
2012-05-02 01:40
106 查看
JavaScript基础
1.变量声明
JavaScript可以使用var显式地声明变量:
var iNum;
因为JS是弱类型语言,即使变量的类型在初始化时已经被确定,也仍然可以之后把他设置成其他类型
var sName = "ziqiu";
alert(sName);
sName=55;
alert(sName);
变量除了可以显式声明,也可以隐式声明,就是不使用var关键词声明,而直接为变量赋值
隐式变量的作用域总是被创建为全局变量。即使在一个函数中的变量也仍然是全局的。
function test()
{
sName="ss";
}
test();
alert(sName); //输出ss
虽然sName是在函数中创建的,但是在函数外层仍然能够访问sName,因为sName是全局变量。
functio test() {
var sName="ss";
}
alert(sName); //输出sName未定义
全局变量是Window对象的属性。
隐式声明的变量都是全局变量。说是"全局"但实际上还是有作用域的,即当前的Window对象。一个全局变量就是Window对象的一个属性。
function test(){
sName = "ss";
test();
alert(sName);
alert(window.sName);
}
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常为一个函数),因而这些变量也是该表达式的一部分
简单表述:
闭包就是function实例以及执行function实例时来自环境的变量。
count是start()函数体内的变量,按照通常的理解为count的作用域是在start()函数内,在调用start()函数结束后应该也会消失。但是此示例的结果是count变来那个会一直存在,并每次被加1
这是因为count变量是setInterval中创建的匿名函数(也就是包含count++的函数)的闭包的一部分!
再通俗地讲,闭包首先就是函数本身,比如上面这个匿名函数本身,同时加上在这个函数运行时需要用到的count变量。
1.变量声明
JavaScript可以使用var显式地声明变量:
var iNum;
因为JS是弱类型语言,即使变量的类型在初始化时已经被确定,也仍然可以之后把他设置成其他类型
var sName = "ziqiu";
alert(sName);
sName=55;
alert(sName);
变量除了可以显式声明,也可以隐式声明,就是不使用var关键词声明,而直接为变量赋值
隐式变量的作用域总是被创建为全局变量。即使在一个函数中的变量也仍然是全局的。
function test()
{
sName="ss";
}
test();
alert(sName); //输出ss
虽然sName是在函数中创建的,但是在函数外层仍然能够访问sName,因为sName是全局变量。
2.变量的作用域与闭包
变量的作用域就是变量的作用范围i,只有在变量的作用域内才可以访问该变量,否则是无法访问此变量的。functio test() {
var sName="ss";
}
alert(sName); //输出sName未定义
全局变量是Window对象的属性。
隐式声明的变量都是全局变量。说是"全局"但实际上还是有作用域的,即当前的Window对象。一个全局变量就是Window对象的一个属性。
function test(){
sName = "ss";
test();
alert(sName);
alert(window.sName);
}
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常为一个函数),因而这些变量也是该表达式的一部分
简单表述:
闭包就是function实例以及执行function实例时来自环境的变量。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>闭包举例</title> </head> <body> <div id="divResult"> </div> <script type="text/JavaScript"> function start() { var count=10; //设置定时器,每隔3秒钟执行一次 window.setInterval(function(){ //定时器,每隔3秒钟执行一次 document.getElementById("divResult").innerHTML +=count +"</br>"; count++; },3000); }; start(); </script> </body> </html>
count是start()函数体内的变量,按照通常的理解为count的作用域是在start()函数内,在调用start()函数结束后应该也会消失。但是此示例的结果是count变来那个会一直存在,并每次被加1
这是因为count变量是setInterval中创建的匿名函数(也就是包含count++的函数)的闭包的一部分!
再通俗地讲,闭包首先就是函数本身,比如上面这个匿名函数本身,同时加上在这个函数运行时需要用到的count变量。
相关文章推荐
- [Javascript]闭包是可以访问上一层函数作用域里变量的函数,即便上一层函数已经关闭
- JavaScript的变量及函数(变量提升、嵌套作用域、条件语句、严格模式、IIFE、闭包、模块化、this、原型)
- javascript——变量闭包1
- javascript 闭包 变量释放GC 测试
- javascript理解之变量作用域与闭包
- JavaScript 变量作用域及闭包第1/2页
- JavaScript闭包-块级作用域和私有变量
- JavaScript的变量作用域和闭包操作
- JavaScript--------通过闭包解决只能取得包含函数中任何变量最后一个值的问题
- JavaScript的小小总结!变量类型、对象声明、this用法、原型、匿名函数、闭包和自执行函数
- JavaScript高级程序设计之函数表达式之闭包之闭包与变量第7.2.1讲笔记
- JavaScript闭包-闭包中的变量和this对象
- 理解Javascript_15_作用域分配与变量访问规则,再送个闭包
- javascript中的闭包循环变量只能取最后一个值问题
- 深入理解JavaScript作用域、变量对象、闭包
- JavaScript执行环境 + 变量对象 + 作用域链 + 闭包
- JavaScript的变量作用域和闭包操作
- javascript局部变量、全局变量、闭包
- JavaScript 变量作用域及闭包
- javascript中的闭包、模仿块级作用域和私有变量