浅谈javascript中的作用域

时间:2024-05-11 09:31:22 

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)同理

标签:作用域
0
投稿

猜你喜欢

  • vscode使用markdown无法预览网络图片的解决方法

    2023-09-01 17:46:36
  • python语言使用技巧分享

    2022-10-24 09:29:38
  • 把网页中的(电话,qq等数字)生成图片的ASP程序

    2011-04-11 10:40:00
  • python的rllib库你了解吗

    2022-03-16 02:18:15
  • Python tkinter实现桌面软件流程详解

    2022-03-26 09:51:32
  • sqlserver服务器验证改为混合验证模式步骤

    2024-01-20 18:02:28
  • 学习Python中一些实用的库

    2022-11-02 13:55:56
  • 总结几个非常实用的Python库

    2023-02-28 11:39:54
  • Python分析彩票记录并预测中奖号码过程详解

    2023-07-20 04:49:18
  • Vue-Access-Control 前端用户权限控制解决方案

    2024-06-07 16:02:57
  • oracle 会话 死锁 执行sql 执行job的方法

    2024-01-18 20:24:59
  • Python通过poll实现异步IO的方法

    2023-07-17 04:08:52
  • python中引用与复制用法实例分析

    2022-09-04 09:54:35
  • 简评:JavaScript将成Silverlight的最大对手?

    2008-10-17 10:29:00
  • JavaScript中 this 指向问题深度解析

    2024-05-03 15:04:14
  • 在Python中操作文件之seek()方法的使用教程

    2023-08-01 14:58:01
  • python中文编码问题小结

    2022-12-22 23:14:14
  • http请求405错误方法不被允许的解决 (Method not allowed)

    2022-10-12 11:12:10
  • JS页内查找关键词的高亮显示

    2013-07-18 21:13:54
  • SQLSERVER2008中CTE的Split与CLR的性能比较

    2024-01-28 06:56:04
  • asp之家 网络编程 m.aspxhome.com