JS一篇文章,我就看了第一篇就觉得很NUMBER,很OHYEAH4

2009年5月12日星期二

JS一篇文章,我就看了第一篇就觉得很NUMBER,很OHYEAH4

隐式的
除了显式的调用之外,JavaScript中的有些function能接受字符形式的JavaScript代码并执行,这相当于隐式的调用了。这些function的典型代表是setTimeout和setInterval。具体请见代码清单7。由于的性能比较差,所以在使用setTimeout和setInterval等function的时候,最好传入function的引用,而不是字符串。

清单7.隐式的示例

varobj={
show1:function(){alert("时间到!");},
show2:function(){alert("10秒一次的提醒!");};
};
setTimeout(obj.show1,1000);
setTimeout("obj.show1();",2000);
setInterval(obj.show2,10000);
setInterval("obj.show2();",10000);
的潜在危险
在目前的Ajax应用中,JSON是一种流行的浏览器端和服务器端处之间传输数据的格式。服务器端传过来的数据在浏览器端通过JavaScript的方法转换成可以直接使用的对象。然而,在浏览器端执行任意的JavaScript会带来潜在的安全风险,恶意的JavaScript代码可能会破坏应用。对于这个问题,有两种解决方式:
带注释的JSON(JSONcommentsfiltering)和带前缀的JSON(JSONprefixing)
这两种方法都是Dojo中用来避免JSON劫持(JSONhijacking)的。带注释的JSON指的是从服务器端返回的JSON数据都是带有注释的,浏览器端的JavaScript代码需要先去掉注释的标记,再通过来获得JSON数据。这种方法一度被广泛使用,后来被证明并不安全,还会引入其它的安全漏洞。带前缀的JSON是目前推荐使用的方法,这种方法的使用非常简单,只需要在从服务器端的JSON字符串之前加上{},再调用。关于这两种方法的细节,请看参考资料。
对JSON字符串进行语法检查
安全的JSON应该是不包含赋值和方法调用的。在JSON的RFC4627中,给出了判断JSON字符串是否安全的方法,是通过两个正则表达式来实现的。具体见代码清单8。关于RFC4627的细节,请看参考资料。

清单8.RFC4627中给出的检查JSON字符串的方法

varmy_JSON_object=!(/[^,:{}\[\]0-9.\-+Eaeflnr-u\n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g,'')))
('('+text+')');
执行上下文(executioncontext)和作用域链(scopechain)
执行上下文(executioncontext)是ECMAScript规范(请看参考资料)中用来描述JavaScript代码执行的抽象概念。所有的JavaScript代码都是在某个执行上下文中运行的。在当前执行上下文中调用function的时候,会进入一个新的执行上下文。当该function调用结束的时候,会返回到原来的执行上下文中。如果function调用过程中抛出异常,并没有被捕获的话,有可能从多个执行上下文中退出。在function调用过程,也可能调用其它的function,从而进入新的执行上下文。由此形成一个执行上下文栈。
每个执行上下文都与一个作用域链(scopechain)关联起来。该作用域链用来在function执行时求标识符(Identifier)的值。在该链中包含多个对象。在对标识符进行求值的过程中,会从链首的对象开始,然后依次查找后面的对象,直到在某个对象中找到与标识符名称相同的属性。如”protype链与继承“中所述,在每个对象中进行属性查找的时候,会使用该对象的prototype链。在一个执行上下文中,与其关联的作用域链只会被with语句和catch子句影响。
在进入一个新的执行上下文的时候,会按顺序执行下面的操作:
创建激活(Activation)对象
激活对象是在进入新的执行上下文的时候被创建出来的,并与新的执行上下文关联起来。在初始化的时候,该对象包含一个名为arguments的属性。激活对象在变量初始化的时候也会被使用。JavaScript代码不能直接访问该对象,但是可以访问该对象里面的成员(如arguments)。
创建作用域链
接下来的操作是创建作用域链。每个function都有一个内部属性[[scope]],它的值是一个包含多个对象的链。该属性的具体值与function的创建方式和在代码中的位置有很大关系(见“function对象的创建方式”)。这个步骤中的主要操作是将上一步中创建的激活对象添加到function的[[scope]]属性对应的链的前面。
变量初始化
该步骤对function中需要使用的变量进行初始化。初始化时使用的对象是第一步中所创建的激活对象,不过被称之为变量(Variable)对象。会被初始化的变量包括function调用时的实际参数、内部function和局部变量。在这个步骤中,对于局部变量,只是在变量对象中创建了同名的属性,但是属性的值为undefined,只有在function执行过程中才会被真正赋值。
全局JavaScript代码是在全局执行上下文中运行的,该上下文的作用域链只包含一个全局对象。
图2中给出了function执行过程中的作用域链的示意图,其中的虚线表示作用域链。

图2.作用域链示意图




functiona(){}、vara=function(){}与vara=newFunction()
在JavaScript中,function对象的创建方式有三种:function声明、function表达式和使用Function构造器。通过这三种方法创建出来的function对象的[[scope]]属性的值会有所不同,从而影响function执行过程中的作用域链。下面具体讨论这三种情况。
function声明
function声明的格式是functionfuncName(){}。使用function声明的function对象是在进入执行上下文时的变量初始化过程中创建的。该对象的[[scope]]属性的值是它被创建时的执行上下文对应的作用域链。
function表达式

0 评论:

发表评论