奇怪的JS
有的时候发现JS是一门很高深的语言,不是我等俗人可以学会,没有private,没有public不说,居然连Class都没有,这个世界就是这样,有的东西你不一定非要想通,也不一定非要剖根问底,有的时候你只需要接受。JS的世界是一个奇怪的世界,变量可以重复定义,this也是一个多变的东西,就连函数也可以有多重角色,我们从下面的例子入手吧,猜猜答案是多少?
function Animal() {
this.name = 'Animal';
this.sleep = function (who) {
alert(who + " sleep!!");
}
}
function Dog() {
Animal.call(this);
}
function test() {
var dog = new Dog();
dog.sleep("dog");
}
function ScopeTest() {
this.Add = function (a, b) {
fAlert();
return a + b;
};
fAlert = function () {
alert('bbbb');
}
}
var sCope= new ScopeTest();
alert(sCope.Add(, ));
test();
JS中最奇怪的就是这个this,我个人认为,因为在C#或者Java中this是始终指向当前的对象的,而JS中的this有的时候指向window,有的时候指向其它对象,有的时候这个this还会被改变,比如上面的代码,当用了call这个函数之后,Animal里面的this就成了dog,这个可以在调试的时候跟踪到:
JS中的所有方法和变量都属于一个作用域,而上面提到的this是始终指向这个作用域的,作用域其实就是一个范围,而且作用域,是在运行的时候决定的,在JS中因为函数充当了类和对象的作用,因此在不用实例化的时候也是可以运行的,如果未采用new关键字,那么函数中的this指向的就是window,如果采用了new,那么情况就不一样了,一个小片段的测试就可以让我们得出结论:
var s="Hell0"
function same() {
var s="Hello!"
alert(this.s);
alert(window.s)
if (this === window) {
alert("the same");
} }
same();
var fSame = new same();
现在看下fSame函数执行的时候this.s弹出undefined,为什么不是函数内部定义的var s="Hell哦!"的值呢?这个就和JS有关了,因为在JS中函数是不能在外部读取内部的以var开始的变量的的值的,如果加上this,那就又不一样了。
var s="Hell0"
function same() {
this. s="Hello!"
alert(this.s);
alert(window.s)
if (this === window) {
alert("the same");
} }
var fSame = new same();
下面这个代码片段的结果又是多少呢?
<script type="text/javascript">
var name = "liu";
function callName() {
alert(name);
var name = "yu";
}
callName();
Javascript在进入一个函数域时,就已经声明好了函数里面需要用到的所有临时变量,注意,仅仅是声明,并没有执行赋值,每个变量的初始值都是undefined,赋值是在执行的时候做的,JS是按照顺序从上到下执行,因此这个弹出undefined的结果,也就解释的清楚了。
JS中各种奇怪,这些奇怪,让我经常陷入陷阱之中,要想理解的深刻,那就自己给自己挖几个陷阱然后跳进去,然后慢慢的爬出来,通过模拟,通过跟踪,通过调试,也许就能拨开云雾见太阳。
奇怪的JS的更多相关文章
- 一个奇怪的JS函数
今天在分析一个jQuery插件源码的时候,发现了一个奇怪的函数. 这个函数的目的是为数字补零,如传入7,输出07,传入12输出12.由于是对时间补零,只截取后两位. // add leading ze ...
- 奇怪的Js时间计算方法,跨多个月后出现1天的误差
在项目中要求用计算两个时间相差的天数,通俗的说就是两个时间 相减, 我的方法 先把两个时间转成相应的毫秒,相减后,再除以(1000 * 60 * 60 * 24) 就可以得到对应天数,但天数会比实际少 ...
- 奇怪的JS正则之 /[A-z]/.test("\\"); // true
本文是在一个国外介绍JS的网站上转载过来的,作者很逗,先是举例JS让人XX的例子,再动手实践发现JS隐藏的黑知识.为什么 /[A-z]/.test("\\"); 是 true ,你 ...
- 奇怪的JS正则表达式问题
同一个正则表达式,为什么在JS里,用 var reg = new RegExp("..."); 定义,验证就各种失败,用 var reg=/.../; 定义,验证就对了...
- jQueryAjax笔记
ajax优点:能在不刷新整个页面的前提下更新数据,使用户操作与服务器响应异步化. ajax缺点:破坏浏览器“前进”.“后退”按钮的正常功能,搜索引擎爬虫不能理解那些奇怪的JS代码和因此引起的页面内容的 ...
- nodejs模块学习: connect解析
nodejs模块学习: connect解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创造大量的轮子来解决 ...
- Python爬虫入门教程 64-100 反爬教科书级别的网站-汽车之家,字体反爬之二
说说这个网站 汽车之家,反爬神一般的存在,字体反爬的鼻祖网站,这个网站的开发团队,一定擅长前端吧,2019年4月19日开始写这篇博客,不保证这个代码可以存活到月底,希望后来爬虫coder,继续和汽车之 ...
- JavaScript中0和""的比较问题
今天在公司的时候发现了一个很奇怪的Js的问题,以前也没有注意到,我从数据库中取出某一个字段的值,而这个字段值刚好是0,然后我在判断这个值是不是等于""时,就出现了如下的问题: 就是 ...
- nodejs 实践:express 最佳实践(五) connect解析
nodejs 实践:express 最佳实践(五) connect解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需 ...
随机推荐
- System.Data.SqlClient.SqlError: 对文件……的目录查找失败[转]
System.Data.SqlClient.SqlError: 对文件……的目录查找失败,出现操作系统错误 3 的处理办法 在还原SQL SERVER数据库时出现了查找目录失败的原因,困扰了我一个多小 ...
- [转]Windows Shell 编程 第二章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987893】
第二章Shell的结构 “Shell 编程”的大伞之下有大量的API函数和COM接口.这个种类繁多的‘命令’集允许你用不同的方法对Windows Shell进行编程.函数和接口并不是两种提供相同功能 ...
- GCD学习之dispatch_barrier_async
iOS常见的多线程开发方式有NSThread.NSOPeration和GCD,抽象程度依次提高,GCD是最抽象的,使用起来最简单,但相对来说功能有限,比如不能cancel任务,这也算是一点遗憾吧. 今 ...
- ssh连接失败解决方法
执行如下命令: ssh-keygen -t dsa -P '' -f /etc/ssh/ssh_host_dsa_key ssh-keygen -t rsa -P '' -f /etc/ssh/ssh ...
- Mac下修改默认的Java版本
今天在安装Elicpse IDE的时候,发现提示安装的Java版本不支持,于是在官方去下载了Jre最新版本并安装,在安装完过后再次打开Elicpse发现提示还是不正确,如果用Google查询到一些资料 ...
- Asp.net 图片文件防盗链介绍
想要实现文件放盗链的功能 首先添加一个全局文件 Global.asax 在 Application_BeginRequest中我们可以判断Http报文头中的UrlReferre是否来源本站. if ( ...
- 点击UserControl中的按钮将值传给winform页面
源码下载地址:http://download.csdn.net/detail/dora_zhh/7456521 1.如图所示,点击选择按钮弹出用户控件UserControl 2.点击确定按钮,将值传给 ...
- 设置Session的超时时间
设置Session的超时时间 IIS 里面有个设置 站点属性->主目录->应用程序配置->选项->启用会话状态->会话超时,可以设置. 在web.config中,设置: ...
- Django同步创建models table失败
django1.8通过manage.py syncdb 执行同步创建models中创建的表格失败 由于syncdb命令在1.9版本中会被remove, 需要改用makemigrations命令进行代替 ...
- PYTHON代码摘录
文件处理 #典型的读取文件代码 row_data = {} with open('PaceData.csv') as paces: column_heading = paces.readline(). ...