在Ajax开发框架中,最基本的划分是服务器端和客户端。服务器端相对来说比较简单,只要是可以开发动态网页的语言都可以胜任;客户端浏览器就是JScript/JavaScript的天下了,好像没有看到有VBScript做的Ajax客户端库。由于客户端依赖于脚本并运行在浏览器中,似乎比服务器端的可实现和可管理性还要差些。
这里我说一下Ajax中的A, Asynchronous调用的一些问题。如果我们在异步调用时不为方法传递任何的参数,那么这个问题也就简单甚至不存在了。但是事实上,我们开发一些稍微复杂些的功能时,对于"脚本异步并发调用参数传递"这个功能是很需要的。说的严重些,可以把这个功能看成Ajax客户端框架能否真正Asynchronous的基石。对于异步调用参数传递的问题,可以看我以前的一篇文章"使用匿名函数为setInterval传递参数"。虽然文中的示例很好地解决了参数传递问题,但是我们看看下面的示例,看会发现什么呢?
function foo() { var param = 100; window.setTimeout(function() { intervalRun(param); }, 0); param = 0; }
function intervalRun(times) { alert(times); } |
我们执行foo,会得到什么样的alert结果呢?100? or 0?,答案是:0。其实写过内嵌函数就知道,这里要真确的传入100,需要这样改写foo方法:
function foo() { var param = 100; var __param = param; window.setTimeout(function() { intervalRun(__param); }, 0); param = 0; }// 这样添加一个变量来存储param就可以了,这下执行foo得到的alert结果就是:100。 |
上面这个修正本身没有问题,可是如果我在并发执行的情况下,就可能又有新的问题。示例代码:
function doTick() { var tick = new Date().getTime(); var __tick = tick; var foo = function() { GetTick(__tick); }; window.setTimeout(foo, 3000); }
function GetTick(tick) { // to do something depend on tick parameter } |
当我们在调用doTick方法时,如果以小于3000ms的频率并发,将会导致前一次的tick变量被后面执行的执行过程修改的问题,从而导致GetTick方法取到错误的tick参数。也就是说必须把doTick方法看成一个,需要"本身执行时间+3000ms"才能运行完的方法,然后再保证并行的执行doTick方法才不会出错。这样的限制条件显然是不可接受的,那么我们该怎么办呢?
其实我们只需要使用内嵌函数自身帮助我们传递参数就行了,修改后的示例如下:
function doTick() { var tick = new Date().getTime(); var foo = function() { var __tick = foo.params[0]; GetTick(__tick); }; foo.params = [tick]; window.setTimeout(foo, 0); } |
由于内嵌函数构造出一个Closure Scope,它将帮组我们保存参数的Context,使我们获得真正的"异步并发调用参数传递"效果。
注意:Closure Scope是JScript编程中危险的高级技术,使用不当极易造成IE Memory Leak。
分享到:
相关推荐
这本书深入浅出地介绍了JavaScript这一广泛应用于网页开发和网络应用的脚本语言。JavaScript,作为全球互联网最常用的编程语言之一,它的学习和理解对于前端开发人员至关重要。 本书涵盖的知识点广泛且深入,包括...
4. 函数:学习如何定义和调用函数,以及函数参数的传递方式。 5. 指针:深入理解指针的概念,如何操作内存和通过指针进行动态内存分配。 6. 预处理器、结构体与联合体:熟悉宏定义、头文件包含,以及结构体和联合体...
JavaScript,一种广泛应用于Web开发的脚本语言,是构成现代互联网交互体验的重要基石。"PPLMinggu7"可能是一个关于深入学习或项目实践JavaScript的课程或者资料包,让我们来深入探讨JavaScript的核心概念以及如何在...
在易买网项目中,JavaScript可以用来验证用户输入、控制页面导航、实现AJAX异步通信等。例如,购物车功能可能需要使用JavaScript来实时计算总价,或者在添加商品时通过AJAX无刷新地更新页面。此外,库如jQuery或现代...
3. 函数:JavaScript中的函数不仅是代码块,还是第一类对象,可以作为参数传递,也可以作为返回值。 三、面向对象编程 JavaScript采用基于原型的面向对象模型,对象可以通过构造函数创建,属性和方法可以通过原型...
2. **邮件发送**:虽然JavaScript不能直接发送电子邮件,但它可以通过AJAX(异步JavaScript和XML)调用服务器端的API来实现邮件发送。用户填写完表单后,JavaScript收集数据并发送到后台服务进行处理。 3. **模拟...
【AJAX异步数据交换】 Asynchronous JavaScript and XML(AJAX)允许网页在不刷新整个页面的情况下,与服务器交换数据并更新部分网页内容。这极大地提高了用户体验。使用`XMLHttpRequest`对象或现代浏览器的`fetch`...
JavaScript,作为互联网前端开发的基石,同时也是后端Node.js平台的重要驱动力,其重要性不言而喻。本篇将深入探讨JavaScript的关键知识点,旨在帮助开发者全面掌握这一技术。 1. **基础语法** JavaScript是一种...
课程可能从基础语法开始,如变量、数据类型、控制结构、函数,然后深入到高级概念,如原型、闭包和异步编程。此外,还会介绍ES6(ECMAScript 2015)及后续版本的新特性,如箭头函数、模板字符串和Promise,这些都是...
4. AJAX:异步JavaScript和XML,用于在不刷新页面的情况下与服务器交换数据。 【压缩包子文件的文件名称列表】"portfolio-react-example-master"可能包含了项目的所有源代码和资源文件,如HTML、CSS、JavaScript...