http://www.xue5.com/WebDev/JavaScript/693311.html
之所以会有此篇文章当然还要从最近的一次面试说起,很抱歉居然又扯到面试上去看,其实不要说,平时不注意的东西,往往在面试时便会立马给你揪出来哪里有问题。
比如我当时就小小的栽了个跟头,栽跟头不要紧,要紧的是我确实对js的一些问题没有了解透彻。
俗话说的好,半灌水响叮当,我就那种一直认为自己js功底好的人,但真的拿出手来说,其实真的有点水了......此时再不好好学习一番,岂不是坐井观天,所以让我们开动吧!
小弟最近的文章基本都是边写边发,若是各位发现什么问题,或者感觉废话太多,请包涵。
闲扯作用域
你了解javascript的作用域吗?真的了解吗?那来试试这道题吧:
1 if (!("a" in window)) { 2 var a = 1; 3 } 4 alert(a);
好吧,拿出你的答案吧,吾已经露出了邪恶的笑容了,因为多数人看着这道题脑壳就有点昏(我会说我也有点昏吗???)
让我们一起来剥离她性感的外衣吧:
第一步:"a" in window这是什么意思?
意思是a是window的属性吗?那我们来做个试验:
我那个去,你会发现不管注释var a 还是不注释,a都是window的属性......于是上面答案呼之欲出!!!但我一团浆糊在我们脑袋中膨胀扩散......
在js的变量作用域中有个原则:所有变量声明都在范围作用域的顶部!
所以,之前我犯了一个愚蠢的错误,错的连我也吃惊,所以我把我自己喝大家都忽悠了,注意陷阱:
其实刚刚上面的完整代码是这样的:
<script type="text/javascript"> // var a; var in_window = 'a' in window; alert(in_window); if (!("a" in window)) { var a = 1; } alert(a); </script>
这样的话:in_window自然是true,这才是隐藏的真相!!!
若是注释下面这些代码的话:
终于正确了,刚刚因为自己的一个错误差点颠覆我最近学习的东西,太可怕了!
现在我们来看看“所有变量申明都会在范围作用域的顶部”是什么意思。
意思是在最下面定义的变量会自动提到上面去啦!!!所以我们定义变量时不如直接全部定义上去算啦。
回到本题:
if (!("a" in window)) { var a = 1; } alert(a);
其实他该是这个样子的。。。。
var a; if (!("a" in window)) { a = 1; } alert(a);
他将if里面的申明也提前了,怎么样不服气吧,其实我也是有点不服气,我想再试试:
var s = ''; if (false) { var a = 1; }
请注意,其中s没有任何意义,就是为了我方便设置断点:
至此真相出现,无论如何a的申明都会提前包括以下几种情况:
var s = '';
while (false) {
var a = 1;
}
变形一
学而不思则罔,我们将题目做个简单变形看看:
if (!("a" in window)) { a = 1; } alert(a);
在if里面去掉了申明,这道题就该是“1”了,但是若是if里面的代码不被执行的话就会报错了哟;
变形2:碰上了函数
刚刚那个现在看来就相对简单了,现在我们看看如此如此这般这般又会如何(我承认我闲的蛋疼好了)?
if (!("a" in window)) { var a = function () { window.a = 1; } } alert(a);
这样一改真的很蛋疼啦,这里不管a被定义为什么,但他是函数表达式,函数表达式就和原来一样,所以不变,if里面不会被执行!
那若是这个样子呢?
if (!("a" in window)) { function a() { window.a = 1; } } alert(a);
这个场景其实我也傻了,那么设置个断点看看:
看来a并不在window中,所以会执行if中的代码;
这里却又引出了另一个问题:到底变量提前或者函数提前?
var a = '1'; function a(){} alert(a);
function a() { } var a = '1'; alert(a);
这两种写法会导致最后输出有所不同吗???
答案是不会,他们的的结果都是1,原因就是函数式申明更加被优先啦,所以无论怎么写函数式什么都在最前面!!
function a() {return false; } if (a()) { var a = '1'; } s = ''; alert(a);
function a() {return true; } if (a()) { var a = '1'; } s = ''; alert(a);
我们前面说过,无论如何,if里面的申明会提前,那么我们这两道题可以改写一下:
var a = function () { return true }; var a; if (a()) { a = '1'; } s = ''; alert(a);
注意来:这里的10行,虽说申明了变量a却没有给其赋值,所以a还是函数,这从这里也可以看出来:
所以上面两个答案就没问题了,一个打印函数,一个打印数字1;
变形三
1 var a = 1, 2 b = function a(x) { x && b(--x); }; 3 alert(a);
现在我不运行代码试试是否可以解析,答案是不可以。。。我解析不出来,还是运行算了吧,我太水了!
这里涉及几个重要概念:
1 变量声明在进入执行上下文就完成了 2 函数声明也是提前的,所有的函数声明都在执行代码之前都已经完成了声明,和变量声明一样 3 函数声明会覆盖变量声明,但不会覆盖变量赋值,如我们上面看到的
想要理清问题,我还是老老实实一步步做工作吧:
根据规则三,这个结果是没有问题的,再看看下面的
从这里可以看出,若是注释了var a,这里function a()压根与它没什么事情,我们可以直接将之忽略(可能有误)
所以该题可以理解为:
var a = 1, b = function (x) { x && b(--x); }; alert(a);
坑爹的我本来是想对js中的this做次研究的,没想到在作用域相关的东西上转了这么久,但是经过这次折腾我相信在这块地方我应该不会出问题了吧???
进入正题
通常情况下, this代表的是前面提到的Globle Object,也就是Browser环境时的window Object.
当function作为某一对象的 method 时, this 代表这个 function 所属的 object
相关推荐
this指触发事件的对象,接下来为大家分享下javascript中onclick(this)的用法,感兴趣的朋友可以参考下哈,希望对你有所帮助
JavaScript中this的指向还没搞明白?来这看看 你就懂啦~
JavaScript程序设计javascript中this的指向问题共6页.pdf.zip
Javascript的this用法
Who is this book for? Who should probably back away from this book? If you can answer “yes” to all of these: We’ll help you learn how to write JavaScript code that makes web pages do all kinds of ...
JavaScript函数this指向问题详解 目录 一、 函数内 this 的指向1、普通函数2、构造函数3、对象方法4、事件绑定方法5、定时器函数6、立即执行函数二、改变函数内部 this 指向1、call 方法2、apply 方法3、bind ...
详解Javascript 中的this指针
高手详解javascript中的this指针
Javascript 中 this指向
JavaScript 中的 this 关键字是一个非常重要的概念,它经常会使开发者感到困 惑。通常来说,this 的值是在函数被调用时确定的,其值取决于函数被调用的方 式。本文将介绍 JavaScript 中 this 的用法,从而帮助开发者...
深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaScript系列(3):全面解析Module模式 深入理解JavaScript系列(4):立即调用...
javascript百炼成仙 第一章 掌握JavaScript基础01 初入宗门
为了美观,很多网页设计师都在网页中添加了JavaScript脚本程序,或者是利用JavaScript来实现一切其它功能。但由于种种原因,我们在打开网页的时候,会弹出错误提示,很是讨厌,那我们如何赶走这讨厌的JavaScript出错...
javascript运行机制之this详细介绍.docx
深入理解JavaScript系列(13):This Yes this 深入理解JavaScript系列(14):作用域链 Scope Chain 深入理解JavaScript系列(15):函数(Functions) 深入理解JavaScript系列(16):闭包(Closures) 深入...
JavaScript 中的this 总是让人迷惑,应该是js 众所周知的坑之一。 个人也觉得js 中的this 不是一个好的设计,由于this 晚绑定的特性,它可以是全局对象, 当前对象,或者…有人甚至因为坑大而不用this。 其实如果...
JavaScript程序设计
No matter how long you’ve been writing JavaScript code, Effective JavaScript will help deepen your understanding of this powerful language, so you can build more predictable, reliable, and ...