那些未理解的javascript死角


昨天在CSDN论坛中看到了这个:http://bbs.csdn.net/topics/390300541 ,Mark了一下。今天有空,仔细看看。

一直以来,对javascript是有偏见的。之前听说过 “Javascript是面向高级程序员,而不是低级的web开发者”。在我看来,就是“弱爆了的自我膨胀的很厉害的编程语言”。也许不止我有,读者也有过这样的认识,只是随着见识的增多,改变了...

下面来解析一下:

	<script type="text/javascript">
	
	function Demo1(){
	
	if (!( a in window)) {
    var a = 1;
	}
	alert (a);
	
	}
	
	function Demo2(){
	
	var a = 1,b = function a (x) { x && a (--x);};
	alert (a);
	
	}
	
	function Demo3(){
	
	function a (x) { return x * 2; }
	var a;
	alert (a);
	
	}
	
	function Demo4(){
	
	function b (x, y, a) {
    arguments[2] = 10;
    alert (a);
	}
	b(1, 2, 3);

	}
		
	function Demo5(){
	//"use strict"
	function a () {
    alert (this);
	}
	a.call (null);
	
	}
	</script>

给出答案:输出对应Demo()答案

  1. undefined
  2. 1
  3. function a (x) { return x * 2; }
  4. 10
  5. null / [Object Window]
也许,我们能从这里发现一些争议。这也就很好的说明了javascript的语言特性:弱类型,解释型。

首先补充说明一下被我了解的javascript特性:
  1. 对解释型语言来说,通过词法分析和语法分析得到语法树后,就可以开始解释执行了。具体点说,解释性语言会预先预先扫描整个源码区域,并进行源码标记,将其方法和属性标记完成后,放置到特定的内存区域,调用时直接传给浏览器解释运行;
  2. 标记时,方法的签名为方法名;
  3. 属性标记时,只声明,并不完成赋值。比如  var a = 3 ,标记的结果会是 var a = undefined,真正的赋值是代码运行到该代码块时完成;
  4. 它的编译方式可以显式的指定。

当知道这些之后,我们来看以上代码中的5个方法:

  • Demo1: in 运算符,是为了判断左边的属性是否在右边所表示的对象中。按照已了解的标记原则,我们的得到了 var a = undefined ,a in window 为true,所以,这段代码无法进入if,所以也不能完成对a的赋值,结果为undefined .
  • Demo2:  考察逗号“,”运算符,在js中,“,”的优先级比“=”小,当代码执行时,首先完成对a的赋值,所以结果为 : 1 .
  • Demo3:方法与属性的标记签名都为a,结合上面介绍的。我们就知道结果会返回 a 方法的代码:function a (x) { return x * 2; } .
  • Demo4:js方法有一个类似于数组的数据结构,用于存放传进来的参数值,这个类数组的下标也是从0开始,所以方法体修改的是传入的第三个参数的值。当我们输出参数a指向的值,所以结果为10.
  • Demo5:call方法一般用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由第一个参数指定的新对象.js默认将this对象指向window,代码的结果将上下文由window修改为null。这个问题出现了两种答案是因为是否指定模式"use strict",当指定时,结果就为null,若不指定,当检测到上下文为null时,即上下文无效,会修改为默认值,即window对象。

后记

  1. 以上解析完全出于个人为了理解一门语言,并不认为为这样刁钻和古怪的用法会在生产中出现。
  2. 也算是对自己曾经的无知的悔意,向伟大的js作者和专家们致敬。
  3. 学无止境。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值