本文实例分析了JavaScript闭包和范围。分享给大家供大家参考,具体如下:

1.
if (!("a" in window)) {
var a = 1;
}
alert(a);
【分析】代码含义:如果window不包含属性a,就声明一个变量a并赋值为1
①JS引擎会先扫描所有的变量声明
②所有的全局变量都是window的属性
③变量声明和赋值一起用时,Js引擎会自动将它分成两部分:变量声明提前,变量赋值没有(不将赋值提前是因为他有可能影响代码执行出不可预期的结果)
所以代码执行顺序等价于
var a;
if(!("a" in window)) {
a = 1;
}
alert(a);
解析:声明变量a,判断a是否存在,不存在就赋值为1,而这里a永远在window里存在,赋值语句永不执行,所以结果是undefined
2.
if (!("a" in window)) {
function a() { window.a = 1; }
}
alert(a);
【分析】
①函数声明也会提前并且会覆盖变量声明,但不会覆盖变量赋值,如下例子
function value(){
return 1;
}
var value;
alert(typeof value); //"function"
function value(){
return 1;
}
var value = 1;
alert(typeof value); //"number"
②所有全局变量都是window属性,语句var a=1;等同于window.a=1;
所以代码执行顺序等价于
function a() {window.a = 1;}
if(!("a" in window)) {
function a() { var a = 1; }
}
alert(a);
输出结果:function a() {window.a = 1; }
变形:
if ("a" in window) {
function a() { window.a = 1; }
}
alert(a);
输出结果:a is not defined
函数声明里的变量定义,要到执行函数时才会定义,并不会在预编译阶段就声明变量
3.
if (!("a" in window)) {
var a = function () { window.a = 1; }
}
alert(a);
【分析】
①函数声明和函数表达式区别
函数声明:
function functionName(arg1, arg2){
//函数体
}
函数表达式(相当于变量赋值):
var functionName = function(arg1, arg2){
//函数体
};
所以代码执行顺序等价于
var a;
if (!("a" in window)) {
a = function () { window.a = 1; }
}
alert(a);
结果和第一题一样,undefined
4.
var a = 1,
b = function a(x) {
x && a(--x);
};
alert(a);
【分析】
①进入执行上下文的阶段
VO(global) = {
a: undefined,
b: undefined
}
这阶段的顺序:函数的形参->函数声明->变量声明
②执行代码阶段
VO(global) = {
x: undefined,
a: 1
}
③定义变量b,赋值名字为a的函数(这个a只能在函数体内使用)
④如果x是任何true值(这这里应该是非0)则执行后面的语句
⑤换成更能理解的代码
var a = 1,
b = function(x) {
x && b(--x);
};
alert(a);
结果为1
5.
function b(x, y, a) {
arguments[2] = 10;
alert(a);
}
b(1, 2, 3);
【分析】没有难点,输出10,如果改成
function b(x, y, a) {
arguments[2] = 10;
alert(a);
}
b(1, 2);
则输出undefined,因为没有传递a的值
6.
function a() {
alert(this);
}
a.call(null);
【分析】
①a.call(b)表示a对象的方法应用到b对象上(即b对象继承了a对象),根据规定,第一个参数是null或undefined,call方法就把全局对象(也就是window)作为this的值
②call()和apply()的区别:功能一样,第二个参数形式不一样,call传递多个参数,任意形式,apply第二个参数必须是数组形式,如
a.call(b,2,3); ==> a.apply(b,[2,3]);
输出结果:[object Window]
更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
# JavaScript
# 闭包
# 范围
# 详解JavaScript的闭包、IIFE、apply、函数与对象
# js闭包用法实例详解
# 深入理解javascript函数参数与闭包
# JS 循环li添加点击事件 (闭包的应用)
# JavaScript中闭包的写法和作用详解
# Javascript闭包与函数柯里化浅析
# 浅谈JavaScript for循环 闭包
# JavaScript闭包实例详解
# 通俗易懂地解释JS中的闭包
# 都是
# 第二个
# 值为
# 全局变量
# 是因为
# 也会
# 相关内容
# 第一个
# 多个
# 遍历
# 会在
# 数据结构
# 就把
# 给大家
# 不存在
# 他有
# 要到
# 将它
# 更能
# 更多关于
相关文章:
如何用AWS免费套餐快速搭建高效网站?
PHP 500报错的快速解决方法
英语简历制作免费网站推荐,如何将简历翻译成英文?
建站之星安装路径如何正确选择及配置?
建站之星备案流程有哪些注意事项?
制作网站的模板软件,网站怎么建设?
如何快速搭建响应式可视化网站?
七夕网站制作视频,七夕大促活动怎么报名?
如何续费美橙建站之星域名及服务?
如何选择高效稳定的ISP建站解决方案?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
如何在阿里云香港服务器快速搭建网站?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
建站之星如何助力企业快速打造五合一网站?
宝塔新建站点为何无法访问?如何排查?
北京专业网站制作设计师招聘,北京白云观官方网站?
存储型VPS适合搭建中小型网站吗?
如何通过智能用户系统一键生成高效建站方案?
香港服务器租用费用高吗?如何避免常见误区?
手机网站制作与建设方案,手机网站如何建设?
如何用VPS主机快速搭建个人网站?
内部网站制作流程,如何建立公司内部网站?
实例解析Array和String方法
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
视频网站制作教程,怎么样制作优酷网的小视频?
大连网站制作公司哪家好一点,大连买房网站哪个好?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何确认建站备案号应放置的具体位置?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
已有域名如何快速搭建专属网站?
如何快速查询域名建站关键信息?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Python路径拼接规范_跨平台处理说明【指导】
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
python的本地网站制作,如何创建本地站点?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
北京制作网站的公司,北京铁路集团官方网站?
免费网站制作appp,免费制作app哪个平台好?
已有域名和空间,如何快速搭建网站?
自助网站制作软件,个人如何自助建网站?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
如何快速重置建站主机并恢复默认配置?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
测试制作网站有哪些,测试性取向的权威测试或者网站?
全景视频制作网站有哪些,全景图怎么做成网页?
宿州网站制作公司兴策,安徽省低保查询网站?
为什么Go需要go mod文件_Go go mod文件作用说明
历史网站制作软件,华为如何找回被删除的网站?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
*请认真填写需求信息,我们会在24小时内与您取得联系。