JavaScript自定义apply与call方法及文件下载技巧
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的历史和发展。
2020-10-18 上传
2024-01-02 上传
2023-08-24 上传
2023-05-21 上传
2023-05-31 上传
2023-06-06 上传
2023-07-05 上传
2023-09-26 上传
2023-09-17 上传
weixin_38692162
- 粉丝: 4
- 资源: 904
最新资源
- JDK 17 Linux版本压缩包解压与安装指南
- C++/Qt飞行模拟器教员控制台系统源码发布
- TensorFlow深度学习实践:CNN在MNIST数据集上的应用
- 鸿蒙驱动HCIA资料整理-培训教材与开发者指南
- 凯撒Java版SaaS OA协同办公软件v2.0特性解析
- AutoCAD二次开发中文指南下载 - C#编程深入解析
- C语言冒泡排序算法实现详解
- Pointofix截屏:轻松实现高效截图体验
- Matlab实现SVM数据分类与预测教程
- 基于JSP+SQL的网站流量统计管理系统设计与实现
- C语言实现删除字符中重复项的方法与技巧
- e-sqlcipher.dll动态链接库的作用与应用
- 浙江工业大学自考网站开发与继续教育官网模板设计
- STM32 103C8T6 OLED 显示程序实现指南
- 高效压缩技术:删除重复字符压缩包
- JSP+SQL智能交通管理系统:违章处理与交通效率提升