JavaScript自定义apply与call方法及文件下载技巧
94 浏览量
更新于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的历史和发展。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2020-10-18 上传
2008-07-18 上传
2020-10-24 上传
2019-03-25 上传
2010-09-20 上传
点击了解资源详情
weixin_38692162
- 粉丝: 4
- 资源: 904
最新资源
- 深入浅出:自定义 Grunt 任务的实践指南
- 网络物理突变工具的多点路径规划实现与分析
- multifeed: 实现多作者间的超核心共享与同步技术
- C++商品交易系统实习项目详细要求
- macOS系统Python模块whl包安装教程
- 掌握fullstackJS:构建React框架与快速开发应用
- React-Purify: 实现React组件纯净方法的工具介绍
- deck.js:构建现代HTML演示的JavaScript库
- nunn:现代C++17实现的机器学习库开源项目
- Python安装包 Acquisition-4.12-cp35-cp35m-win_amd64.whl.zip 使用说明
- Amaranthus-tuberculatus基因组分析脚本集
- Ubuntu 12.04下Realtek RTL8821AE驱动的向后移植指南
- 掌握Jest环境下的最新jsdom功能
- CAGI Toolkit:开源Asterisk PBX的AGI应用开发
- MyDropDemo: 体验QGraphicsView的拖放功能
- 远程FPGA平台上的Quartus II17.1 LCD色块闪烁现象解析