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 相关文章推荐
两个SUBMIT按钮,如何区分处理
Aug 22 Javascript
JavaScript 设计模式学习 Singleton
Jul 27 Javascript
JQuery 确定css方框模型(盒模型Box Model)
Jan 22 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
Aug 07 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
Nov 27 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
angularJS 中$scope方法使用指南
Feb 09 Javascript
详解Backbone.js框架中的模型Model与其集合collection
May 05 Javascript
node.js路径处理方法以及绝对路径详解
Mar 04 Javascript
Bootstrap CSS组件之导航条(navbar)
Dec 17 Javascript
vue.js 初体验之Chrome 插件开发实录
May 13 Javascript
jQuery实现本地存储
Dec 22 jQuery
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
第1次亲密接触PHP5(2)
2006/10/09 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
JavaScript类继承及实例化的方法
2015/07/25 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
python中Lambda表达式详解
2019/11/20 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
考试不及格检讨书
2014/01/09 职场文书
年度考核自我鉴定
2014/03/19 职场文书
5s推行计划书
2014/05/06 职场文书
党员志愿者活动总结
2014/06/26 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
避暑山庄导游词
2015/02/04 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python