[Js]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]
[Js]JavaScript闭包和范围的快速测试的更多相关文章
- JS JavaScript闭包和作用域
JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外一个函数作用域中变量的函数. 从概念上,闭包有两个特点: 1.函数 2.能访问另外一个函数的作用域中的变量 在ES6之前,JavaS ...
- Js(javaScript)的闭包原理
问题?什么是js(javaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 小编 ...
- javascript从定义到执行 js引擎 闭包
javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境 栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链 ...
- 我从来不理解JavaScript闭包,直到有人这样向我解释它...
摘要: 理解JS闭包. 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正如标题所述,JavaScript闭包 ...
- 我从来不理解 JavaScript 闭包,直到有人这样向我解释它...
正如标题所述,JavaScript 闭包对我来说一直有点神秘,看过很多闭包的文章,在工作使用过闭包,有时甚至在项目中使用闭包,但我确实是这是在使用闭包的知识. 最近看国外的一些文章,终于,有人用于一种 ...
- JavaScript闭包使用姿势指南
目录 JavaScript闭包使用姿势指南 引言 闭包的定义 来个有趣的例子吧 现在我们换个例子吧 我们再来个有趣的例子 内存泄露问题 用闭包解决递归调用问题 用闭包模拟私有方法 在循环中使用闭包 性 ...
- [JavaScript闭包]Javascript闭包的判别,作用和示例
闭包是JavaScript最重要的特性之一,也是全栈/前端/JS面试的考点. 那闭包究竟该如何理解呢? 如果不爱看文字,喜欢看视频.那本文配套讲解视频已发送到B站上供大家参考学习. 如果觉得有所收获, ...
- 深入理解JS的闭包
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...
- Javascript闭包深入解析及实现方法
1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点:1. 作为一个函数变量的一个引用,当函数返回时 ...
随机推荐
- shiro连接数据库
建一个jdbcRealm.ini [main] jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm dataSource=com.mchange.v2.c3 ...
- mysql 内连接 左连接 右连接 外连接
mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | ...
- hostapd源代码分析(一):网络接口和BSS的初始化
[转]hostapd源代码分析(一):网络接口和BSS的初始化 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004349 最近在做一 ...
- Mysql的最佳优化经验20多条
原文:http://blog.csdn.net/lifuxiangcaohui/article/details/6207801 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其 ...
- linux简单配置
lsof -i lsof -i:211.判断apache查找httpd路径: ps aux | grep httpd 结果: /usr/local/apache/bin/httpd /usr/loc ...
- bloom filter 详解[转]
Bloom Filter概念和原理 焦萌 2007年1月27日 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.Bloom ...
- VirtualBox的网络配置,Host Only+NAT方式 (zhuan)
http://blog.csdn.net/xinghun_4/article/details/7969894 ***************************************** 其实网 ...
- RAC 集群更换IP
RAC 集群更换 IP 主要分三步:停集群服务.配置服务器网络.修改集群配置.下面是同网段内更换 IP 示例.(r7.r8为服务器名称,orcl为ORACLE_SID,scanip为 scan 名称) ...
- commonJS — 字符串操作(for String)
for String github: https://github.com/laixiangran/commonJS/blob/master/src/forString.js 代码 /** * Cre ...
- 在IIS7.5打开网页的时候,提示: HTTP 错误 500.0 - Internal Server Error 调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.dll" 上。解决方法