作家
登录

浅谈javascript中的作用域

作者: 来源:www.28hudong.com 2013-03-30 00:30:00 阅读 我要评论

JS中作用域的概念:   表示变量或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境。Javascript的作用域只有两种:全局作用域和本地作用域,本地作用域是按照函数来区分的。 首先来看几道题目: 1. 复制代码 代码如下: if(true){ var aa= "bb"; } console.log(aa); //bb for(var i = 0; i < 100; i++){ //do } console.log(i); //100 2. 复制代码 代码如下: var bb = '11111'; function aa() { alert(bb);//undefine var bb = 'test'; alert(bb);//test    var cc = "test1"; alert(age);//语法错误 } aa(); 3. 复制代码 代码如下: var test = '1111111'; function aa() { alert(test); } function bb() { var test = '22222222'; aa(); } bb();//alert(1111111); 4. 复制代码 代码如下: alert(typeof aa); //function alert(typeof bb); //undefined function aa() { //函数定义式 alert('I am 111111111'); }; var bb = function() { //函数表达式 } alert(typeof bb);//function 5. 复制代码 代码如下: function aa(){ var bb = "test"; cc = "测试"; alert(bb); } aa(); alert(cc);//测试 alert(bb);//语法报错 上面这5道题目全部概括了js中作用域的问题 可以总结出这么几个观点 一、无块级作用域 从第一题中可以看出来,在{}中执行后,变量并没有被销毁,还是保存在内存中的,因此我们可以访问到的。 二、JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. 这里提到函数的作用域链这个概念,在ECMA262中,是这样的 任何执行上下文时刻的作用域, 都是由作用域链(scope chain)来实现. 在一个函数被定义的时候, 会将它定义时候的scope chain链接到这个函数对象的[[scope]]属性. 在一个函数对象被调用的时候,会创建一个活动对象(也就是一个对象), 然后对于每一个函数的形参,都命名为该活动对象的命名属性, 然后将这个活动对象做为此时的作用域链(scope chain)最前端, 并将这个函数对象的[[scope]]加入到scope chain中. 所以题目3 结果是alert(1111111); 三、JS会提前处理function定义式 和var关键字   如题目4 开始alert(bb); //undefine ,alert(age)//语法报错,这两个有什么区别呢,原因就是后面有var bb =“test”,在初始化的时候提前处理了var 这个关键字,只是这个开始未赋值 将代码修改成这样的,可以看出来 复制代码 代码如下: var dd = '11111'; function aa() { alert(bb);//undefine    var bb = 'test'; alert(bb);//test    var cc = "test1"; alert(age);//语法错误 } aa(); alert(dd);//11111 alert(cc);//语法报错 此处alert(bb)没有报语法错误,alert(age)报语法错误。 但是请注意: 复制代码 代码如下: <script> alert(typeof aa); //结果:undefined </script> <script> function aa() { alert('yupeng'); } </script> 这说明js预编译是以段为单元的。题目4同理 四、函数级作用域   函数里面的定义的变量,在函数执行完后就销毁了,不占有内存区域了。   所以题目2最后的alert(cc);语法报错,题目5最后到 alert(bb)同理

  推荐阅读

  jQuery UI Dialog 创建友好的弹出对话框实现代码

主要参数 jQuery UI Dialog常用的参数有: 1、autoOpen:默认true,即dialog方法创建就显示对话框 2、buttons:默认无,用于设置显示的按钮,可以是JSON和Array形式: {"确定":function(){},"取消":function(){}} [>>>详细阅读


本文标题:浅谈javascript中的作用域

地址:http://www.17bianji.com/kaifa2/JS/23460.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)