博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
细读 JavaScript 之静态作用域与动态作用域区别
阅读量:7196 次
发布时间:2019-06-29

本文共 952 字,大约阅读时间需要 3 分钟。

静态作用域与动态作用域区别

看到标题,相信大家有点懵逼,什么是静态作用域?什么又是动态作用域?先抛开这些不谈,我们先来看一个题目,这个题目来自于《你不知道的 JavaScript》(上)。

function foo(){    console.log(a);}function bar(){    var a = 3;    foo();}var a = 2;bar();复制代码

执行以上代码,输出是什么?我们发现输出是2?这是啥情况,为什么不是 3,而是 2?到底是什么原因造成的?因为 JavaScript 是采用词法作用域的,那么 a 在 foo 函数内找不到,那么按照词法作用域, a 会去函数定义时的环境中找,也就是 2。

静态作用域

静态作用域(即词法作用域)中的函数遇到既不是形参也不是函数内部定义的局部变量的变量时,会去函数定义时的环境中查询

动态作用域

动态作用域中的函数遇到既不是形参也不是函数内部定义的局部变量的变量时,到函数调用时的环境中查


既不是形参也不是函数内部定义的局部变量的变量即自由变量。形参或函数内部定义的局部变量即约束变量

通过上面的描述,我们再看一题。

var scope = "global scope";function checkscope(){    var scope = "local scope";    function f(){        return scope;    }    return f();}checkscope();复制代码
var scope = "global scope";function checkscope(){    var scope = "local scope";    function f(){        return scope;    }    return f;}checkscope()();复制代码

猜猜两段代码各返回什么?两段代码都返回 local scope。因为 scopef 函数内找不到,所以会在函数定义时的作用域查找,所以是 local scope

参考

转载于:https://juejin.im/post/5c9dc0ba6fb9a070c70f18b0

你可能感兴趣的文章
保存图片
查看>>
使用TMG2010让多个web服务器共用一个公网地址
查看>>
与CIO的交友攻略(内附详解,圈内疯传)
查看>>
polysh批量执行shell命令
查看>>
如何使用GNS3和Cisco IOU搭建路由交换实验-IOU篇
查看>>
keepalived 多实例
查看>>
mysql部分参数注解
查看>>
***PHP Notice: Undefined index: ..问题的解决方法
查看>>
php模块安装
查看>>
Python3.2 --- Print函数用法
查看>>
Django 当中使用CSS之类的东西如何设置路径
查看>>
ssh免密码登录 rsh rcp部署
查看>>
RHEL7普通权限、特殊权限、acl的设置
查看>>
Centos6.6安装选包及基础场景说明
查看>>
备份前一天文件名中包含日期的文件
查看>>
修改kvm虚拟机的root密码和其他用户密码
查看>>
在C#中实现截获shell程序的输出
查看>>
vi 编辑器进入后无法退出
查看>>
一个Mysql自动备份脚本
查看>>
Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl
查看>>