本文实例分析了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程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]