JavaScript闭包和范围实例详解


Posted in Javascript onDecember 19, 2016

本文实例分析了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与CSS复习(二)
Jun 29 Javascript
JavaScript通过字典进行字符串翻译转换的方法
Mar 19 Javascript
简介JavaScript中的sub()方法的使用
Jun 08 Javascript
JavaScript中的toDateString()方法使用详解
Jun 12 Javascript
谈谈AngularJs中的隐藏和显示
Dec 09 Javascript
js控制div层的叠加简单方法
Oct 15 Javascript
AngularJs入门教程之环境搭建+创建应用示例
Nov 01 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
May 20 jQuery
js实现带进度条提示的多视频上传功能
Dec 13 Javascript
react-router4 嵌套路由的使用方法
Jul 24 Javascript
vue 本地环境跨域请求proxyTable的方法
Sep 19 Javascript
JS setTimeout与setInterval的区别
Apr 20 Javascript
JS前端笔试题分析
Dec 19 #Javascript
利用vue实现模态框组件
Dec 19 #Javascript
JS中如何实现复选框全选功能
Dec 19 #Javascript
BootStrapValidator校验方式
Dec 19 #Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 #Javascript
JavaScript中this的用法实例分析
Dec 19 #Javascript
JS填写银行卡号每隔4位数字加一个空格
Dec 19 #Javascript
You might like
php车辆违章查询数据示例
2016/10/14 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
常用的javascript设计模式
2017/01/11 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
python 中文乱码问题深入分析
2011/03/13 Python
使用cx_freeze把python打包exe示例
2014/01/24 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
Python Merge函数原理及用法解析
2020/09/16 Python
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
大学生四个方面的自我评价
2013/09/19 职场文书
保安员岗位职责
2013/11/17 职场文书
金融专业个人求职信范文
2013/11/28 职场文书
安全生产实施方案
2014/02/23 职场文书
社区义诊活动总结
2014/04/30 职场文书
校园环保标语
2014/06/13 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
遗嘱格式范本
2015/08/07 职场文书