全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript闭包和范围实例详解

本文实例分析了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小时内与您取得联系。