本文概述
- 调用函数的方式
- 有什么区别
var reverse = function(text){return text.split("").reverse().join("");
};
// Orfunction reverse(text){return text.split("").reverse().join("");
}
我们可以将其执行为:
通话属性
调用属性使你可以执行函数并正确更改此上下文, 然后跟通常的常规函数??一样, 用逗号分隔特定的参数。
var animals = [{ species: 'Lion', name: 'King' }, { species: 'Whale', name: 'Fail' }];
for (var i = 0;
i <
animals.length;
i++) {(function(i) {this.print = function() {console.log('#' + i + ' ' + this.species+ ': ' + this.name);
}this.print();
}).call(animals[i], i);
// Change the this context to the animal object}
申请财产
除了它支持的参数类型外, apply与call非常相似。你可以使用arguments数组代替命名的参数集。使用apply时, 可以使用数组文字或数组变量。
以下示例覆盖console.log方法。但是, 我们希望做与console.log相同的事情, 但要做的是之前和之后的事情, 因此我们使用apply执行原始console.log方法, 因此我们不必担心参数的位置。将会以它们到达的相同方式发送。请注意, arguments变量是一个数组(在此处了解有关函数内部的关键字arguments的更多信息)。
var originalLog = console.log;
console.log = function() {// Do something your before execute somethingAnImaginaryFunctionThatDoesSomething(arguments);
// Call the function as it would have been called normally:// Note that with apply we change the this context and sendoriginalLog.apply(this, arguments);
// Run another thing after the original console.log};
直接执行
如果你决定直接调用一个函数, 则直接执行一个函数不会有任何问题。但是, 你不能更改此上下文, 并且参数总是会受到限制, 就像call属性一样。
你只需要在调用变量之前检查该变量是否为函数。
if(typeof(reverse) === "function"){reverse("otto");
}
有什么区别你与前面的示例之间没有区别吗?没问题, apply和call之间的区别非常简单。请参见以下示例:
var teacher = function(name, age, area) {console.log("My name is " + name + ", i'm "+age+" years old and i'm a " + area + " teacher. The context of this is " + this);
};
teacher("John", 20, "History");
teacher.apply(true, ["Patty", 23, "Music"]);
teacher.call(undefined, "Bruce", 44 , "Mathematics");
// Outputs//My name is John, i'm 20 years old and i'm a History teacher. The context of this is [undefined]//My name is Patty, i'm 23 years old and i'm a Music teacher. The context of this is [true]//My name is Bruce, i'm 44 years old and i'm a Mathematics teacher. The context of this is [undefined]
他们完成相同的任务, 执行功能。唯一的区别是参数的发送方式以及可以提供多少个参数。
- 直接应用, 调用或调用函数, 只需执行即可(带或不带参数)。
- 只能在apply和call方法中更改此上下文。
- 直接调用函数或使用调用不允许使用动态参数, 因此会明确声明它们(如果声明了5个参数, 则只会发送5个)。
- 使用apply允许你向函数发送动态参数(有限的参数, 如果数组作为第二个参数有500个项目, 则该函数将分别接收数组的500个项目作为参数)。
推荐阅读
- 在Ubuntu 16.04中通过composer安装库时,如何解决”系统中缺少所需的PHP扩展名bcmath”的问题
- 如何使用Python计算两个图像之间的结构相似指数(SSIM)
- 如何使用JavaScript触发直接下载PDF
- 如何使用JavaScript中的网络摄像头创建实时条形码扫描仪
- 如何在Ubuntu 16.04中使用OCRmyPDF使基于图像的PDF(图像到文本)可以选择和搜索
- 如何使用JavaScript检测浏览器是否支持Webp图像格式
- 如何通过语音命令即时切换Artyom.js的语言
- 如何在Ubuntu 18.04中使用Coturn创建和配置自己的STUN/TURN服务器
- 在Ubuntu 18.04中使用Python通过音频指纹创建自己的Shazam(识别歌曲)