本文共 3474 字,大约阅读时间需要 11 分钟。
在软件开发中,函数是代码的核心单元之一。函数可以作为独立的操作模块实现特定功能,但其定义方式有多种,灵活性更强。以下是常见的函数定义方式及其特点分析。
此种方式通过function关键字定义函数,简洁且直接。适用于在全局或函数级别定义基本操作。
function fn(a, b) { return a + b;} let 或 const 定义,不能直接用于变量声明。采用function关键字作为表达式的一部分,适合在模块化或函数表达式式中使用。
let fun = function(a, b) { return a + b;}; 通过new 操作符调用Function构造函数生成函数实例,适用于传统的对象化方法。
let fun = new Function('a', 'b', 'return a + b'); 比声明式更简短,适用于函数表达式,并支持剩余参数。
let fn = (a, b) => { return a + b;}; Function实例,继承自Object。this可能导致错误,需要谨慎操作。this指向取决于如何调用,需谨慎设计。不同场景下的函数调用方式有多种,可灵活选择以满足需求。
直接使用函数名称或引用执行。
fun();fun.call();
函数作为对象的属性被调用时,this指向对象本身。
obj.fun();
用于创建对象时,函数作为构造函数执行。
new Fun();
将函数赋值给对象的事件属性,系统会自动触发调用。
btn.onclick = function() { // 定义具体操作}; 通过setInterval或setTimeout定时调用函数。
setInterval(function() { // 定时器执行操作}, 1000); 函数通过()直接调用,适用于不需要this指向的情况。
(function() { // 定义操作})(); this指向this指向取决于函数调用的方式,正确理解是开发成功能的重要基础。
| 调用方式 | this指向 |
|---|---|
| 普通函数调用 | 全局对象(浏览器环境下是 window) |
| 构造函数调用 | 实例对象或原型对象 |
| 对象方法调用 | 所有属性所属的对象 |
| 事件绑定函数调用 | 绑定对象 |
| 定时器函数调用 | 全局对象(窗口对象) |
| 立即执行函数调用 | 全局对象(窗口对象) |
| 箭头函数调用 | 箭头函数定义时所在的 this 值 |
this是静态的,始终指向函数定义时的 this 值。call或apply方法。this指向call方法fun.call(thisArg, arg1, arg2, ...);
this和传递参数,适用于需要多次继承的场景。-```javascriptfunction add(a, b) {console.log(a + b);}let obj = { c: 520 };add(1, 2); // this指向 windowadd.call(obj, 1, 2); // this指向 obj### 2. 使用` apply `方法```javascriptfun.apply(thisArg, [argsArray]);
call,但传递参数为数组形式。-```javascriptfunction add(a, b) {console.log(a + b);}add(1, 2); // this指向 windowadd.apply(obj, [1, 2]); // this指向 obj### 3. 使用` bind `方法```javascriptfun.bind(thisArg, arg1, arg2, ...);
fun,而是返回一个新的函数。-```javascriptfunction add(a, b) {console.log(a + b);}let obj = { c: 520 };let f = add.bind(obj, 1, 2); // this指向 objf(); // 调用时 this仍然指向 obj## 5. 自定义` call `、` apply `、` bind `方法### 1. 自定义` call `方法```javascriptexport default function call(Fn, obj, ...args) { obj = obj === undefined || obj === null ? globalThis : obj; obj.temp = Fn; let result = obj.temp(...args); delete obj.temp; return result;} apply方法export default function apply(Fn, obj, arr) { obj = obj === undefined || obj === null ? globalThis : obj; obj.temp = Fn; let result = obj.temp(...arr); delete obj.temp; return result;} bind方法import call from './call';export default function bind(Fn, obj, ...args) { return function(...args2) { return call(Fn, obj, ...args, ...args2); };} import call from "./call";import apply from "./apply";import bind from "./bind";console.log("****test call ****");function add(a, b) { console.log(this); return a + b + this.c;}let obj = { c: 521, };window.c = 1314;console.log(call(add, obj, 10, 20));console.log(call(add, null, 30, 40));console.log(obj);console.log("****test apply****");console.log(apply(add, obj, [10, 20]));console.log(apply(add, null, [30, 40]));console.log(obj);console.log("****test bind****");let fn = bind(add, obj, 10, 20);console.log(fn());let fn2 = bind(add, obj);console.log(fn2(10, 20)); 这篇文章系统地介绍了函数的定义方式及其调用方法,结合实际案例进行讲解,力求帮助开发者更高效地使用不同函数类型。
转载地址:http://lqtpz.baihongyu.com/