JavaScript自定义apply与call方法及文件下载技巧

0 下载量 83 浏览量 更新于2024-07-15 收藏 170KB PDF 举报
"这篇资源主要介绍了两个JavaScript的实用小技巧:自定义的`apply`和`call`方法,以及一个用于下载文件的函数。同时,还提供了一个检查网络连接是否有效的函数示例。" 在JavaScript中,`apply`和`call`是两个非常重要的函数,它们允许我们改变函数调用时的上下文(即`this`关键字的指向)以及传递参数。原始的`apply`和`call`方法是内置在函数对象上的,但在这个资源中,作者提供了自定义实现的版本。 1. 自定义`apply`: 自定义的`apply`方法通过在给定的对象上设置`_caller`属性来保存原函数引用,然后利用`eval`执行构造的字符串表达式来调用函数。如果`obj`存在,它会将`this`绑定到`obj`,否则绑定到当前的`this`。参数`argu`被转换为数组并加入到调用表达式中。 ```javascript Function.prototype.apply = function (obj, argu) { if (obj) obj.constructor.prototype._caller = this; var argus = new Array(); for (var i = 0; i < argu.length; i++) { argus[i] = "argu[" + i + "]"; } var r; eval("r = " + (obj ? ("obj._caller(" + argus.join(",") + ");") : ("this(" + argus.join(",") + ");"))); return r; }; ``` 2. 自定义`call`: 自定义的`call`方法则更加简单,它接收一个对象作为参数,并通过`apply`来调用原函数,将`arguments`对象的剩余元素作为参数传入。 ```javascript Function.prototype.call = function (obj) { var argu = new Array(); for (var i = 1; i < arguments.length; i++) { argu[i - 1] = arguments[i]; } return this.apply(obj, argu); }; ``` 3. 下载文件: 下载文件的函数`DownURL`使用了ActiveXObject,这通常在旧版的Internet Explorer中使用。它创建了一个XMLHttpRequest对象来发送GET请求获取远程文件,然后利用ADODB.Stream对象来处理响应体,将其保存到本地文件。 ```javascript function DownURL(strRemoteURL, strLocalURL) { try { var xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP"); xmlHTTP.open("Get", strRemoteURL, false); xmlHTTP.send(); var adodbStream = new ActiveXObject("ADODB.Stream"); adodbStream.Type = 1; // 1=adTypeBinary adodbStream.Open(); adodbStream.write(xmlHTTP.responseBody); adodbStream.SaveToFile(strLocalURL, 2); adodbStream.Close(); adodbStream = null; xmlHTTP = null; } catch (e) { window.confirm("下载URL出错!"); } } ``` 4. 检查连接有效性: `getXML`函数用于检查一个URL能否成功获取XML数据,它也依赖于ActiveXObject,但这个功能在现代浏览器中可能无法工作,因为不再支持ActiveXObject。 ```javascript function getXML(URL) { var xmlhttp = new ActiveXObject("microsoft.xmlhttp"); // ... } ``` 这些技巧展示了如何扩展JavaScript的内置功能,以及在不支持现代API的环境中处理文件下载和网络请求的方法。虽然现代浏览器可能已经提供了更安全、更高效的方式来实现这些功能,但在了解这些经典技术的同时,也能更好地理解JavaScript的历史和发展。