奇怪的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 的基础不稳固,需 ...
随机推荐
- shell脚本实例(2)
1.传给脚本一个参数:目录,输出该目录中文件最大的,文件名和文件大小 #!/bin/bash if [ $# -ne 1 -o ! -d $1 ];then echo "Args is er ...
- 设计模式------STRATEGY(策略模式)
http://blog.csdn.net/wuzhekai1985/article/details/6665197.仅供参考. 策略模式:实现替换功能,如cache替换算法:当发生Cache缺失时,C ...
- python出现Non-ASCII character '\xe7' in file ex6.py on line 1, but no encoding declare错误
http://www.cnblogs.com/qi09/archive/2012/02/06/2340712.html python中出现Non-ASCII character '\xe7' in f ...
- 捕获JSON 解析错误
$json = <<<JSON { "origin":"Delhi", "destination":"Londo ...
- linux process 相关命令
1.显示指定用户信息:ps -u root 2.显示所有进程信息,连同命令行:ps -ef 3. ps 与grep 常用组合用法,查找特定进程:ps -ef|grep ssh 4. 把所有进程显示出来 ...
- 无限大整数相加算法的C语言源代码
忙里偷闲,终于完成了无限大整数相加算法的C语言代码,无限大整数相加算法的算法分析在这里. 500位的加法运行1000次,不打印结果的情况下耗时0.036秒,打印结果的情况下耗时16.285秒. 下面是 ...
- 第一个 MIC shared_memory 程序
设置Intel编译器的运行环境 在terminal中执行编译器的环境脚本 compilervars.sh: source <install-dir>/bin/compilervars.sh ...
- debian 学习记录-5
后裔排名 1 Debian - 1292 Fedora - 633 Knoppix - 50 (Knoppix本身是Debian后裔) Debian4 SuSE - 28 Debian,由Ian Mu ...
- Swift 学习笔记1
最近在看Swift,努力在看相关的文档以及书籍,因为Swift3.0的更新,以及它开源了,所以打算写一些关于Swift的相关文章.让Swift能够更好的被我理解
- jQuery.hhNewSilder 滚动图片插件
/** * jQuery.hhNewSilder 滚动图片插件 * User: huanhuan * QQ: 651471385 * Email: th.wanghuan@gmail.com ...